new关键字执行四步:一创建空对象;二将该对象__proto__指向构造函数prototype;三以该对象为this执行构造函数初始化属性;四按规则返回对象或构造函数返回的引用类型。

new 关键字不是简单地“调用函数并返回对象”,它触发了一套严格、不可跳过的内部流程,目的是创建一个具备正确原型链和初始化状态的实例。理解这四步,才能真正掌握 JavaScript 的面向对象机制。
第一步:创建一个干净的空对象
引擎先生成一个最基础的普通对象({}),它不带任何自有属性,也没有被赋予任何行为。这个对象就像一张白纸,等待后续步骤来定义它的结构和能力。
第二步:建立原型连接(__proto__ 指向 prototype)
把新对象的隐式原型(__proto__)设置为构造函数的 prototype 属性。这一步建立了继承关系——实例从此可以访问构造函数原型上定义的所有方法和共享属性。比如 Person.prototype.sayHi 就能被 new Person() 创建的每个实例调用。
第三步:绑定 this 并执行构造函数体
以这个新对象为 this,调用构造函数,并传入参数(如 Constructor.call(obj, arg1, arg2))。构造函数里所有对 this 的赋值(例如 this.name = name)都会直接添加到该对象上,完成实例自身的属性初始化。
第四步:决定最终返回值
这一步有明确规则:
- 如果构造函数没有 return,或返回的是原始值(字符串、数字、布尔、null、undefined),new 表达式就返回第一步创建的那个对象;
- 如果构造函数显式 return 了一个对象(包括数组、函数、正则等引用类型),new 表达式就放弃初始对象,直接返回那个 return 出来的对象。
这个细节常被忽略,却是控制实例化结果的关键出口。











