new到底做了哪些事情?
- 創(chuàng)建一個新的對象
- 繼承父類原型上的方法
- 添加父類的屬性到新的對象上
- 如果有返回值并且返回值是一個對象, 則返回執(zhí)行的結(jié)果灭贷; 否則, 返回新創(chuàng)建的對象
實現(xiàn)一個new
function Aminal(name, age) {
this.name = name;
this.age = age;
}
Aminal.prototype.sayHello = function () {
return ` i am ${this.name}`;
};
function _new(object, ...rest){
// 創(chuàng)建一個新的對象
// 繼承父類原型上的方法
const newObj = Object.create(object.prototype);
// 添加父類的屬性到新的對象上并初始化
const result = object.apply(newObj, rest);
// 如果有返回值并且返回值是一個對象, 則返回執(zhí)行的結(jié)果篡撵; 否則, 返回新創(chuàng)建的對象
return result instanceof Object ? result : newObj;
}
const dog1 = new Aminal('小白', 2);
const dog2 = _new(Aminal, '小黑', 3);
console.log(dog1, dog2)