在 JavaScript 中,new
操作符用于创建一个给定构造函数的实例对象。它的执行流程可以细分为以下几个步骤:
-
创建一个新的空对象:
new
操作符首先会创建一个新的空对象{}
。这个对象会被用作构造函数的上下文(即this
的值)。
-
链接到原型:
- 新创建的对象的
__proto__
属性会被设置为构造函数的prototype
属性。这一步实现了原型链的继承,使得新对象可以访问构造函数原型上定义的方法和属性。
- 新创建的对象的
-
绑定
this
并执行构造函数:- 构造函数会以其
this
指向新创建的对象来调用。这意味着在构造函数内部,你可以通过this
来访问新对象的属性和方法,或者添加新的属性和方法。 - 如果构造函数返回了一个对象,那么这个返回的对象会被用作
new
表达式的最终结果;否则,new
表达式的结果是新创建的对象。
- 构造函数会以其
-
返回新对象:
- 如果构造函数没有显式返回一个对象(即返回了
undefined
或null
),那么new
操作符会返回新创建的对象。 - 如果构造函数显式返回了一个对象,那么
new
操作符会返回这个对象,而不是新创建的对象。
- 如果构造函数没有显式返回一个对象(即返回了
示例代码
function Person(name, age) {
this.name = name;
this.age = age;
// 如果没有这一行,会返回新创建的对象
// 如果加上这一行并返回一个对象,会返回这个对象
// return { custom: 'object' };
}
const person1 = new Person('Alice', 30);
console.log(person1); // { name: 'Alice', age: 30 }
function AnotherPerson() {
this.name = 'Bob';
return { custom: 'object' };
}
const person2 = new AnotherPerson();
console.log(person2); // { custom: 'object' }
总结
new
操作符创建一个新对象。- 新对象的
__proto__
指向构造函数的prototype
。 - 构造函数以新对象为上下文执行,可以添加属性和方法。
- 构造函数显式返回对象时,
new
表达式返回该对象;否则返回新创建的对象。
理解 new
操作符的执行流程对于掌握 JavaScript 中的对象创建和原型继承机制非常重要。