new运算符到底是做什么的?(1)首先创建一个空对象。(2)设置原型,将对象的原型设置为函数的原型对象。(3)让函数的this指向这个对象,执行构造函数中的代码(4)判断函数的返回值类型,如果是值类型,返回创建的对象,如果是引用类型,返回此引用类型的对象。意识到?functionobjectFactory(){letnewObject=null,construct=Array.prototype.shift.call(anguments),result=null//参数判断if(typeofconstruct!=='function'){console.error('typeerror')return}//创建一个新的空对象,其原型为构造函数的原型对象newObject=Object.create(construct.prototype)//将this指向新创建的对象并执行result=construct.apply(newObject,arguments)//判断返回对象ifflag=result&&(typeofresult==='object'||typeofresult==='boolean')returnflag?result:newObject}判断返回值类型?对于返回值,当构造函数返回基本数据类型时,此时返回的结果就是我们创建的对象newObject。当构造函数返回引用类型对象时||函数,返回结果值。这个时候通过apply函数重新绑定this点,也就是说构造函数返回的是什么引用类型的值,当前的返回值类型是什么。具体代码可见://构造函数返回引用数据类型Objectletfoo=objectFactory([functionFoo(){this.name='name';returnnewObject("name")},1])console.log(foo,"--------")//[String:'name']--------//当构造函数的返回值为Object("name")时,所以此时返回值returnresult,程序通过apply改变了this的指向,指向构造函数的返回值Object('name'),所以此时使用new运算符的返回值就是参考数据type[String:'name']//构造函数返回基本数据类型Stringletfoo=objectFactory([functionFoo(){this.name='name';return'sss'},1])console.log(foo,"------")//foo{name:'name'}------//当构造函数的返回值为字符串时,所以此时返回newObject,那么此时的返回值为Foo
