返回

new 关键字的实现

前端

函数实现 new 的功能,即创建一个新对象并初始化它。这个函数通常被用来代替 new ,在某些情况下,使用这个函数可能比使用 new 关键字更方便或更有效。

实现原理

要实现一个类似 new 操作符的函数,首先我们来分析一下 new 关键字都干了些什么。

先来看个 demo:

function Person(name) {
    this.name = name;
}
const person = new Person('Jack');

我们可以看到,当构造函数的执行结果没有返回值(返回 undefined)时,new 会:

  1. 创建一个新对象。
  2. 将构造函数的 this 指向这个新对象。
  3. 执行构造函数,并将构造函数的实参作为参数传入。
  4. 返回这个新对象。

因此,我们可以模仿 new 的行为,实现一个类似 new 的函数。

实现代码

function new (func, ...args) {
    // 创建一个新对象
    const obj = {};
    // 将构造函数的 this 指向这个新对象
    func.call(obj, ...args);
    // 返回这个新对象
    return obj;
}

现在,我们就可以使用这个函数来创建对象了:

const person = new Person('Jack');

这个代码的效果与使用 new 关键字创建对象是一样的。

使用场景

这个函数可能在以下情况下比 new 关键字更方便或更有效:

  • 当我们想要创建多个相同类型的对象时,可以使用这个函数来简化代码。
  • 当我们想要在创建对象时进行一些额外的操作时,可以使用这个函数来实现。
  • 当我们想要在不同的环境中使用 new 关键字时,可以使用这个函数来模拟 new 的行为。

扩展

function new(func, ...args) {
    // 创建一个新对象
    const obj = Object.create(func.prototype);
    // 将构造函数的 this 指向这个新对象
    func.call(obj, ...args);
    // 返回这个新对象
    return obj;
}

这样,我们就可以通过这个函数来创建继承其他对象的子对象了。

function Person(name) {
    this.name = name;
}

function Student(name, grade) {
    Person.call(this, name);
    this.grade = grade;
}

const student = new Student('Jack', 100);

这个代码的效果与使用 new 关键字创建子对象是一样的。

函数实现 new 的功能是一个非常有用的技巧,它可以帮助我们更灵活地创建对象。