小小的new,大大 的能量

71 阅读1分钟

new做了什么事儿?

  • 创建一个空对象,这个对象会作为执行new构造函数之后返回的对象实例。
  • 将空对象的原型(__proto__)指向构造函数的prototype属性。
  • 将这个空对象赋值给构造函数内部的this,并执行构造函数逻辑。
  • 如果构造函数返回一个对象,那么new返回这个对象,否则返回第一步创建的空对象。

new的实现

function myNew(func, ...args) {
    const constructor = func;// 目标构造函数
    // 创建一个空对象,这个空对象会继承构造函数的prototype属性;
    // 实现obj.__proto__ === constructor.prototype
    const obj = Object.create(constructor.prototype);
    // 执行构造函数,得到构造函数的返回结果
    // 这里使用apply,将构造函数内的this指向obj
    const result = constructor.apply(obj, args);
    // 如果构造函数执行后,返回结果是对象类型,就直接返回,否则返回obj对象
    return typeof result === "object" && result !== null ? result : obj;
}

使用:

function Fn(name) {
    this.name = name;
}
const fn = myNew(Fn,'lisi');
console.log('fn',fn);// { name:"lisi"}

我们知道,构造函数如果有返回值,且返回值为对象类型,那么构造函数的返回结果不再是目标实例,示例如下:

function Fn(name) {
    this.name = name;
    return { say: "小黑" };
}
const fn = myNew(Fn, "lisi");
console.log("fn", fn);// { say: "小黑" }