
6

前端面试之new操作符具体都干了什么?
source link: https://segmentfault.com/a/1190000040823916
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

new操作符具体都干了什么?
- (1) 首先创建了一个空对象。
- (2) 设置原型,将对象的原型设置为函数的prototype对象。
- (3) 让函数的this指向这个对象,执行构造函数中的代码
(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
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK