new调用函数时,对象创建与原型连接严格分两步:先创建无属性的空对象(__proto__未设置),再将其[[Prototype]]指向构造函数的prototype,确保实例属性写入与原型方法继承分离。

用 new 调用函数时,对象的创建与原型连接不是一步完成的,而是严格按顺序执行的两个独立阶段:先创建空对象,再建立原型链。这两步缺一不可,且顺序不能颠倒。
第一步:创建一个干净的空对象
JavaScript 引擎内部会生成一个全新的普通对象(等价于 Object.create(null) 或 {}),它不继承任何属性,也没有自有属性,__proto__ 尚未设置。这个对象就是后续所有操作的载体。
- 它和字面量
{}表面相似,但语义不同——这是专为实例化准备的“空白画布” - 此时对象还不能访问构造函数原型上的方法,因为原型链尚未建立
- 这一步不涉及任何用户代码执行,纯引擎内部动作
第二步:将新对象连接到构造函数的 prototype
引擎把上一步创建的对象的 [[Prototype]](可通过 __proto__ 访问)指向构造函数的 prototype 属性所引用的对象。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 例如
function Person() {},则新对象的__proto__ === Person.prototype为true - 这一步让实例具备了“继承能力”,能顺着原型链查找方法和共享属性
- 注意:
Person.prototype.constructor默认指向Person,但可被修改,不影响连接本身
为什么必须分两步?
如果先执行构造函数再设原型,this 在函数体内就无法访问原型上的方法;如果跳过创建直接连接,就没有承载属性的实体。只有先有空对象,再连原型,最后绑定 this 执行函数,才能保证属性写入实例、方法来自原型的清晰分工。
立即学习“Java免费学习笔记(深入)”;
不复杂但容易忽略。

















