手写new
new操作符做了什么事情:
1.创建一个空对象 将来会返回这个对象
2.调用构造函数,并将构造函数的this指向新创建的对象obj
3.把原型对象的方法给新创建的obj,把obj的__proto__指向构造函数的显式原型
4.判断构造函数的返回值,来决定new的返回值(是构造函数的返回值还是实例化对象)
第一种
function myNew(Func, ...args) {
// 创建一个空的对象
const instance = {};
// 将实例化对象的原型指向构造函数的原型对象
if (Func.prototype) {
instance.__proto__ = Func.prototype
}
// 将构造函数的this指向实例化对象
const res = Func.apply(instance, args);
//判断返回值
if (typeof res === "function" || (typeof res === "object" && res !== null)) {
return res;
}
return instance
}
第二种
利用Object.create()方法
1.创建对象
2.将新创建的实例对象原型指向了构造函数
function myNew(Func, ...args) {
// 创建一个空的对象,将实例化对象的原型指向构造函数的原型对象
const instance = Object.create(Func.prototype);
// 将构造函数的this指向实例化对象
const res = Func.apply(instance, args);
//判断返回值
return typeof res === "object" ? res : instance;
}
测试
function Person(name) {
this.name = name
}
Person.prototype.sayName = function () {
console.log(`My name is ${this.name}`)
}
const me = myNew(Person, 'Jack')
me.sayName()
console.log(me)