new运算符到底干了啥
- 创建一个空对象obj
- obj继承这个构造函数的原型链
- 执行Fn.call(obj, …args)
- 如果这个构造函数没有返回值,或是返回值为基本类型,返回obj;否则,按照构造函数的返回
例如:现有一个构造函数Fn
function Fn (x) {
this.x = x
}
此时执行new运算符
let obj = new Fn(...args)
则obj经历如下
let obj = (function () {
// 1. 创建一个空对象_obj
let _obj = Object.create(null)
// 2. 继承这个构造函数的原型链
_obj.__proto__ = Fn.prototype
// 3. 执行Fn.call(_obj, ...args)
let result = Fn.call(_obj, [].slice.call(arguments))
// 4. 如果result是一个对象,返回result,否则返回_obj
if (typeof result === 'object' && result !== null) {
return result
} else {
return _obj
}
})(...args)