返回

揭开JavaScript中new运算符背后的奥秘:剖析new及其原生实现

前端

JavaScript中的new运算符是一个强大的工具,它可以用来创建一个新的对象。它是一个关键词,后面跟着一个构造函数的名称,然后是可选的参数列表。构造函数是一个特殊的函数,它用来创建一个新对象并对其进行初始化。

new运算符的工作原理如下:

  1. 创建一个新的空对象。
  2. 将构造函数的作用域赋给新对象。
  3. 执行构造函数,并将构造函数的参数传递给新对象。
  4. 将新对象返回给new运算符。

例如,以下代码创建一个新的Person对象:

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

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

console.log(person.name); // John
console.log(person.age); // 30

上面的代码首先定义了一个Person构造函数,它有两个参数:name和age。然后,它使用new运算符创建了一个新的Person对象,并将其赋值给person变量。最后,它使用console.log()方法来打印person对象的name和age属性。

new运算符也可以用来调用内置的构造函数,比如Array、Object和Date。例如,以下代码创建一个新的数组:

const array = new Array(1, 2, 3);

console.log(array); // [1, 2, 3]

上面的代码使用Array构造函数创建了一个新的数组,并将1、2和3作为参数传递给它。然后,它使用console.log()方法来打印数组。

new运算符是一个非常强大的工具,它可以用来创建各种各样的对象。它也是JavaScript中面向对象编程的基础。

原生实现new

JavaScript中的new运算符是由引擎原生实现的,它在底层会执行以下步骤:

  1. 创建一个新的空对象。
  2. 将构造函数的作用域赋给新对象。
  3. 执行构造函数,并将构造函数的参数传递给新对象。
  4. 将新对象返回给new运算符。

我们可以使用以下代码来查看new运算符的原生实现:

function new(constructor, ...args) {
  const obj = {};
  Object.setPrototypeOf(obj, constructor.prototype);
  const result = constructor.apply(obj, args);
  return result === undefined ? obj : result;
}

上面的代码定义了一个名为new的函数,它接受两个参数:构造函数和构造函数的参数。它首先创建一个新的空对象,然后将构造函数的作用域赋给新对象。接下来,它执行构造函数,并将构造函数的参数传递给新对象。最后,它将新对象返回给new运算符。

如果构造函数的返回值不是undefined,那么new运算符将返回构造函数的返回值,否则它将返回新对象。

总结

new运算符是JavaScript中一个非常强大的工具,它可以用来创建各种各样的对象。它也是JavaScript中面向对象编程的基础。原生实现new运算符的代码非常简单,但它却非常强大,可以用来创建各种各样的对象。