共计 1190 个字符,预计需要花费 3 分钟才能阅读完成。
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
正文完
发表至: javascript
2021-10-17