构造函数的prototype被重新赋值后,不会影响已创建的旧实例——其__proto__在new时已固定指向原prototype,与新prototype无关;新实例才使用新prototype,且需手动补constructor属性以防丢失。

构造函数的 prototype 被重新赋值后,**不会影响已创建的旧实例**——旧实例的 __proto__ 仍指向原来的原型对象,和新 prototype 无关。
旧实例的 __proto__ 是创建时就固定下来的
每个实例在 new 执行的第二步中,其内部 [[Prototype]](即 __proto__)就被设为「当时」构造函数的 prototype 值。这个链接是一次性绑定,后续改构造函数的 prototype 不会反向更新已有实例。
- 假设
function Foo() {},然后const a = new Foo()→ 此时a.__proto__ === Foo.prototype(指向最初那个空对象) - 接着执行
Foo.prototype = { bar: 1 };→ 这只是让Foo.prototype指向一个新对象 -
a.__proto__依然指向旧原型,a.bar读不到,a.__proto__ === Foo.prototype变为false
新实例才使用新 prototype
只有在重赋值 prototype 后再调用 new Foo() 创建的实例,其 __proto__ 才会指向新的原型对象。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
-
const b = new Foo()(在重赋值之后)→b.__proto__ === Foo.prototype为true -
b.bar可以访问到,而a.bar仍为undefined
constructor 属性容易被意外覆盖
直接重赋 prototype(如 Foo.prototype = {...})会丢失默认的 constructor 指针,导致 a.__proto__.constructor 不再指向 Foo。
- 修复方式:在新原型中手动补上
constructor: Foo - 例如:
Foo.prototype = { constructor: Foo, say() { } }; - 否则
new Foo().__proto__.constructor === Foo为false,可能影响类型判断或序列化逻辑
实际影响只发生在“读取属性”时
旧实例不受影响,但要注意:如果旧原型上有引用类型属性(如数组、对象),多个旧实例仍共享它;而新原型上的同名属性对旧实例完全不可见。
- 旧原型有
Foo.prototype.items = []→ 所有旧实例共用这个数组 - 新原型定义
items: ['a']→ 旧实例读不到,也不会触发修改旧数组 - 这是“原型隔离”,不是“数据同步”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










