new运算符原理
function simpleNew(fn) {
// 1.创建一个空对象,并把原型对象指向fn.prototype
var obj = {}
obj.__proto__ = fn.prototype
// Object.create(fn.prototype) // 或者使用Object.create创建对象
// 2.执行fn,传入this上下文,使fn的熟悉挂载到obj对象上
var result = fn.call(obj)
// 3.如果构造函数执行后返回一个“对象”,则会取代整个new出来的结果;如果没有返回对象,则返回new出来的对象
if(typeof result === 'object') {
return result
} else {
return obj
}
}
// 对于第3点原理
function Foo() {
this.name = 'nic'
return { a: 1 }
}
console.log(new Foo()) // { a: 1 }
function Foo2() {
this.name = 'nic'
return 'a'
}
console.log(new Foo2()) // Foo {name: 'nic'}