New:
创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
注意:构造函数不需要显示的返回值。使用new来创建对象(调用构造函数)时,如果return的是非对象(数字、字符串、布尔类型等)会忽略返回值;如果return的是对象,则返回该对象(注:若return null也会忽略返回值)。
以下是源码实现:
// 测试:
function Foo(name) {
this.name = name
}
const newObj = myNew(Foo, '你好')
console.log(newObj) // Foo {name: "你好"}
console.log(newObj instanceof Foo) // true
function myNew(fn, ...args){
// 创建新对象,并继承构造方法的prototype属性, 这一步是为了把obj挂原型链上
// 相当于obj.__proto__ = Foo.prototype,
let obj = Object.create(fn.prototype);
// 执行构造方法, 并为其绑定新this, 这样 obj 就可以访问到构造函数原型中的属性
// 这一步是为了让构造方法能进行this.name = name之类的操作,
let ret = fn.apply(obj,args)
// 如果构造方法已经return了一个对象,那么就返回该对象 即 ret
// 否则返回myNew创建的新对象 即 obj
return typeof ret === 'object' ? ret : obj
}