返回

new 的作用及手写 new

前端

new 的作用

在 JavaScript 中,new 运算符用于创建对象的实例。它通过调用一个函数并在该函数内部使用this来创建对象。

const person = new Person();

上面的代码创建一个Person类的实例。当new Person()被调用时,Person函数被执行,并且this关键字指向一个新的对象。该对象将成为person变量的值。

new 的返回值

new 运算符的返回值取决于所调用的函数。如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

function Person() {
  // 返回一个对象
  return {
    name: "John Doe",
    age: 30
  };
}

const person = new Person();

console.log(person);
// 输出:{name: "John Doe", age: 30}
function Person() {
  // 没有返回对象
}

const person = new Person();

console.log(person);
// 输出:Person {}

手写 new

我们可以通过以下步骤手写 new 运算符:

  1. 创建一个新对象。
  2. 将构造函数的prototype属性赋给新对象的__proto__属性。
  3. 将构造函数的this关键字指向新对象。
  4. 执行构造函数。
  5. 返回新对象。
function new(constructor, ...args) {
  // 创建一个新对象
  const obj = {};

  // 将构造函数的prototype属性赋给新对象的__proto__属性
  obj.__proto__ = constructor.prototype;

  // 将构造函数的this关键字指向新对象
  const boundFn = constructor.bind(obj);

  // 执行构造函数
  boundFn(...args);

  // 返回新对象
  return obj;
}

使用上述手写 new 函数,我们可以创建一个Person类的实例:

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

const person = new Person("John Doe", 30);

console.log(person);
// 输出:Person {name: "John Doe", age: 30}

总结

new 运算符在 JavaScript 中用于创建对象的实例。它通过调用一个函数并在该函数内部使用this关键字来创建对象。new 运算符的返回值取决于所调用的函数。如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。我们可以通过以下步骤手写 new 运算符:创建新对象,将构造函数的 prototype 属性赋给新对象的 proto 属性,将构造函数的 this 关键字指向新对象,执行构造函数,返回新对象。