// 创建一个新对象;
// 设置新对象的原型为构造函数的原型对象;
// 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
// 执行构造函数中的代码;
// 返回新对象。
function myNew(constructor, ...args) {
// 1. 创建一个新对象
let obj = {};
// 2. 设置新对象的原型为构造函数的原型对象
obj.__proto__ = constructor.prototype;
// 3. 将构造函数的作用域赋给新对象,同时执行构造函数中的代码
let result = constructor.apply(obj, args);
// 4. 如果构造函数返回了一个对象,则返回该对象;否则返回新对象
return result instanceof Object ? result : obj;
}
// 测试
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayName = function() {
console.log(`My name is ${this.name}`);
};
let p1 = myNew(Person, "Tom", 18);
p1.sayName(); // "My name is Tom"
console.log(p1.age); // 18
console