javascript 中原型对象的 constructor 属性默认指向创建该原型对象的构造函数。例如,person.prototype.constructor 指向 person 函数本身。如果手动重写了原型对象(如 person.prototype = { ... }),则 constructor 会丢失并指向全局的 object,需要手动修复。

为什么重写原型会导致 constructor 丢失?
当直接给 prototype 赋值一个新对象时,新对象内部的 constructor 属性默认指向 Object,因为它是通过 Object 构造函数创建的。这切断了与自定义构造函数的联系。

function Person(name) {
this.name = name;
}
// 错误做法:直接覆盖原型
Person.prototype = {
sayName: function() {
console.log(this.name);
}
};
const p = new Person('Alice');
console.log(p.constructor === Object); // true, 丢失了 Person 引用
console.log(p.constructor === Person); // false
如何正确修复和保持 constructor 指向?
在重写原型后,必须手动将 constructor 指回原构造函数,或者使用 Object.defineProperty 来定义它,以保持其不可枚举性。

// 方法一:手动指定
Person.prototype = {
constructor: Person,
sayName: function() {
console.log(this.name);
}
};
// 方法二:使用 defineProperty (推荐)
Object.defineProperty(Person.prototype, 'constructor', {
value: Person,
enumerable: false, // 防止被 for...in 遍历
writable: true,
configurable: true
});
const p = new Person('Bob');
console.log(p.constructor === Person); // true
实例对象的 constructor 指向逻辑是什么?
实例对象本身没有 constructor 属性,它是通过原型链向上查找得到的。因此,instance.constructor 实际上等同于 instance.__proto__.constructor。只要原型上的 constructor 指向正确,实例就能正确获取到构造函数引用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











