前端面试之new操作符具体都干了什么()
new操作符具体都干了什么?
- (1) 首先创建了一个空对象。
- (2) 设置原型,将对象的原型设置为函数的prototype对象。
- (3) 让函数的this指向这个对象,执行构造函数中的代码
- 【前端面试之new操作符具体都干了什么()】(4) 判断函数的返回值类型,如果是值类型,则返回创建的对象,如果是引用类型,则返回这个引用类型的对象。
实现一下?function objectFactory(){ let newObject = null, construct = Array.prototype.shift.call(anguments), result = null// 参数判断 if(typeof construct !== 'function'){ console.error('type error') return }// 新建一个空对象,对象的原型为构造函数的prototype对象 newObject = Object.create(construct.prototype) // 将this 指向这个新建对象,并执行 result = construct.apply(newObject,arguments)// 判断返回对象 if flag = result && (typeof result === 'object' || typeof result === 'boolean') return flag ? result : newObject }
判断返回值类型??对于返回值来讲,当构造函数返回的是基本数据类型,那么此时返回的结果是我们所创建的对象newObject
,当构造函数返回的是引用类型object || function
时,返回的是result
值,此时通过apply函数又重新绑定了this指向,也就是说构造函数返回的是什么引用类型的值,当前返回值类型就是什么。
?具体代码可见:
// 构造函数返回引用数据类型Object let foo = objectFactory([function Foo(){ this.name = 'name'; return new Object("name") },1]) console.log(foo,"--------")// [String: 'name'] -------- // 当构造函数返回值为Object("name"),所以返回值此时返回result,程序又通过apply改变了this的指向,指向了构造函数的返回值Object('name'),所以此时使用new操作符的返回值为引用数据类型[String: 'name']// 构造函数返回基本数据类型String let foo = objectFactory([function Foo(){ this.name = 'name'; return 'sss' },1]) console.log(foo,"--------")// Foo { name: 'name' } -------- // 当构造函数返回值为字符串,所以此时返回newObject,则此时的返回值为Foo