SOURCE

// 创建一个新对象;
// 设置新对象的原型为构造函数的原型对象;
// 将构造函数的作用域赋给新对象(因此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 命令行工具 X clear

                    
>
console