constructor 会丢失是因为用字面量重写 prototype 后新对象无该属性,沿原型链找到 Object.prototype.constructor;需手动恢复指向,如 MyClass.prototype.constructor = MyClass 或用 Object.defineProperty 设置;ES6 类自动维护 constructor,无需额外处理。

JavaScript 中原型对象的 constructor 属性默认指向构造函数本身,但容易被意外覆盖或丢失,尤其在手动修改 prototype 时。关键是要在重写原型后,显式恢复 constructor 的指向。
为什么 constructor 会丢失?
当你用字面量方式重写构造函数的 prototype(比如 Foo.prototype = { ... }),新对象没有 constructor 属性,它会沿原型链向上找——最终找到 Object.prototype.constructor,也就是 Object,导致指向错误。
如何正确设置 constructor 指向?
在替换原型对象后,手动把 constructor 指回原构造函数:
- 直接赋值:
MyClass.prototype.constructor = MyClass; - 用
Object.defineProperty确保该属性可枚举、可配置(更规范):
Object.defineProperty(MyClass.prototype, 'constructor', {<br> value: MyClass,<br> enumerable: false,<br> writable: true,<br> configurable: true<br>});
ES6 类中的 constructor 情况
使用 class 声明时,类体内的 constructor 方法自动成为原型的 constructor,且不可枚举、不可删除。虽然你不能直接改 MyClass.prototype.constructor 的值,但它始终指向该类,无需额外处理。
立即学习“Java免费学习笔记(深入)”;
实际开发中要注意什么?
大多数现代工具链(如 Babel)编译类时会自动修复 constructor;但如果手写继承、用 Object.create() 或深拷贝原型,就得自己检查并补上。可以用 instance.constructor === MyConstructor 验证是否正确。


















