new 关键字做了什么操作

370 阅读1分钟

new 关键字做了什么操作

  1. 首先创建一个空对象,这个对象将会作为执行构造函数之后返回的对象实例
  2. 使上面创建的空对象的原型(proto)执行构造函数的 prototype 属性
  3. 将这个空对象赋值给构造函数内部的this,并执行构造函数逻辑
  4. 根据构造函数执行逻辑,返回第一步创建的对象或者构造函数的显式返回值

代码实现

function newFunc(...args) {
    // 取出 arguments 数组的第一个参数,即目标构造函数
    const constructor = args.shift();
    //   创建一个空对象继承构造函数的prototrype属性
    const obj = Object.create(constructor.prototype);
    // 执行构造函数,得到构造函数返回结果
    const result = constructor.apply(obj, args); //注意使用apply使构造函数内的this指向obj

    //  构造函数执行后,返回结果是对象类型,则直接将该结果返回,否则返回obj对象
    return typeof result === "object" && result != null ? result : obj;
}

function Csss(name) {
    console.log(name);
    this.da = name;
}
let data = newFunc(Csss, "CHu");
console.log(data);