new函数的本质有以下过程:
- 创建一个空对象
- 为空对象进行prototype绑定
- 执行构造函数的方法,并将this绑定到新创建的对象
- 返回构造函数返回的对象。如果构造函数没有显式返回,则返回第一步创建的对象。
以上过程来自于MDN官方文档
所以我们进行代码实现
function father(name) {
this.name = name
this.sayName = function () {
console.log(this.name)
}
}
function myNew(obj, ...etc) {
// 新建一个对象
let newObj = new Object()
// 为对象连接原型
newObj.__proto__ = obj.proptotype
// 使用构造函数创建对象,并将this绑定到当前对象
let res = obj.call(newObj, ...etc)
// 如果构造函数有返回值,那么返回我们构造的对象。如果构造函数没有返回值,就返回最初新建的对象。
return res instanceof Object ? res : newObj
}
let Faker = myNew(father, 'Faker')
Faker.sayName() // Faker