当使用 new
操作符来创建一个对象时,JavaScript 引擎会执行一系列操作,以确保正确地创建并初始化一个新的对象。new
操作符背后的过程可以分为以下几个步骤:
1. 创建一个新对象
首先,new
操作符会创建一个新的空对象,这个对象将会成为将要实例化的构造函数的实例。
2. 将构造函数的作用域赋给新对象
接下来,new
操作符会将新创建的对象的 __proto__
属性(内部属性)指向构造函数的原型对象,从而建立起原型链关系。这样新对象就可以访问到构造函数原型对象上的属性和方法。
3. 执行构造函数代码
然后,new
操作符会将构造函数的作用域赋给新对象,使得 this
关键字指向新对象。这样构造函数内部的代码就可以操作新对象,并对其进行初始化。
4. 返回新对象
最后,如果构造函数没有显式地返回一个对象,则 new
操作符会隐式地返回新创建的对象;如果构造函数显式地返回一个对象,则返回该对象。
示例代码
为了更好地理解 new
操作符的过程,以下是一个简单的示例代码:
// 构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// 使用 new 操作符创建实例
let person1 = new Person('Alice', 30);
// 相当于以下操作:
let person2 = {
};
Person.call(person2, 'Bob', 25); // 将构造函数作用域赋给新对象
person2.__proto__ = Person.prototype; // 将新对象的 __proto__ 指向构造函数的原型对象
在这个示例中,Person
是一个构造函数,person1
和 person2
分别是通过 new
操作符创建的实例。实际上,new Person('Alice', 30)
执行的过程等价于 Person.call(person2, 'Bob', 25)
,其中 person2
是一个空对象,最后返回的就是 person2
。