JavaScript中函数的prototype默认有constructor属性回指自身;若重写prototype会丢失该指向,需手动修复;实例通过原型链访问constructor,但instanceof或Object.getPrototypeOf更可靠。

在 JavaScript 中,每个函数(包括构造函数)创建时都会自动获得一个 prototype 属性,指向一个对象(即原型对象);而这个原型对象默认有一个 constructor 属性,它会**回指**到原始的构造函数。这是实现“从原型反查构造函数”的核心机制。
constructor 属性的默认指向关系
当你定义一个构造函数时,JavaScript 引擎会自动设置其 prototype.constructor 指向该函数本身:
function Person(name) {
this.name = name;
}
console.log(Person.prototype.constructor === Person); // true
这意味着:只要没手动修改过 prototype,就能通过原型对象安全访问 constructor 得到原构造函数。
注意:重写 prototype 会丢失 constructor
如果直接给 prototype 赋值一个新对象(比如用字面量或 Object.create()),默认的 constructor 就会断开:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
function Animal() {}
Animal.prototype = { eat() { console.log('eat'); } };
console.log(Animal.prototype.constructor === Animal); // false
console.log(Animal.prototype.constructor); // Object(因为 {} 是 Object 的实例)
此时需手动修复:
- 赋值后立即补上
constructor: - 或使用
Object.defineProperty确保不可枚举(更规范):
Animal.prototype.constructor = Animal;
Object.defineProperty(Animal.prototype, 'constructor', {
value: Animal,
enumerable: false,
writable: true,
configurable: true
});
实例对象如何通过 constructor 找回构造函数
实例对象自身没有 constructor,但它会沿原型链向上查找 —— 最终落在 Constructor.prototype 上,从而读取到 constructor:
const p = new Person('Alice');
console.log(p.constructor === Person); // true(实际是 p.__proto__.constructor)
console.log(p.constructor === p.__proto__.constructor); // true
⚠️ 注意:如果原型链被篡改(如修改了 __proto__ 或重写了 prototype 且未修复 constructor),这个链就可能失效。
现代替代方案:优先使用 instanceof 或 Object.getPrototypeOf
依赖 constructor 并不总是可靠(易被覆盖、不具强制性)。更健壮的方式包括:
-
p instanceof Person—— 检查原型链中是否存在Person.prototype -
Object.getPrototypeOf(p) === Person.prototype—— 精确比对直接原型 -
Reflect.getPrototypeOf(p)—— 同上,ES6 推荐写法
这些方法不依赖 constructor 是否被修改,更适合类型判断场景。

















