原型对象的constructor属性默认指向其构造函数,由引擎自动初始化;实例通过原型链访问该属性;重写prototype需手动修复constructor;虽可用于判断构造函数但不可靠。

原型对象的 constructor 属性直接指向它所归属的构造函数,这是 JavaScript 内置的双向关联机制——不是手动设置的,而是引擎在创建函数时自动初始化的。
constructor 是原型对象的默认属性
每个函数被定义时,其 prototype 属性会自动生成一个对象,这个对象天然带有 constructor 属性,值就是该函数本身:
-
function Person() {}→Person.prototype.constructor === Person为 true -
function Animal() {}→Animal.prototype.constructor === Animal同样成立 - 甚至内置构造函数也如此:
Array.prototype.constructor === Array、Date.prototype.constructor === Date
constructor 不是实例的属性,而是原型上的
注意:实例对象(如 const p = new Person())没有自己的 constructor 属性。它能访问到 p.constructor,是因为属性查找沿着原型链向上,最终落在 Person.prototype 上:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
p.constructor实际读取的是Person.prototype.constructor -
p.hasOwnProperty('constructor')返回 false,证明它不在实例自身 -
Object.getPrototypeOf(p) === Person.prototype,确认了这条链路
重写 prototype 时需手动修复 constructor
如果用字面量重写了整个 prototype,默认的 constructor 会被覆盖丢失:
- 错误写法:
Person.prototype = { sayHi() { } };→ 此时Person.prototype.constructor指向Object,不再是Person - 正确做法:显式恢复,例如
Person.prototype = { constructor: Person, sayHi() { } };或更稳妥地在赋值后补上Person.prototype.constructor = Person;
constructor 可用于判断对象由哪个构造函数创建
虽然不能完全替代 instanceof 或 Object.prototype.toString(尤其面对跨 iframe 或继承场景),但在简单场景下可辅助识别:
({}).constructor === Object([]).constructor === Array(/a/).constructor === RegExp- 但要注意:
constructor可被修改,不具备绝对可靠性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










