constructor属性在函数定义时即被设置于其prototype对象上,指向该函数本身;实例自身无此属性,通过__proto__链访问原型上的constructor;它可在new执行第二步(建立原型连接)后被访问,但属可写普通属性,易被篡改。

constructor 本身不是“执行阶段”,而是构造函数的引用属性,它在实例化过程中并不主动执行;真正执行的是构造函数体内的代码。但 constructor 属性的指向关系,是在实例化四步流程中逐步确立并可被访问的。
constructor 属性何时被设置?
constructor 不是运行时动态生成的,而是构造函数 prototype 对象自带的属性,默认指向该构造函数本身。例如:
Person.prototype.constructor === Person —— 这个关系在函数定义时就已存在,不依赖 new 操作。
实例上的 constructor 是怎么来的?
新实例对象自身并没有 constructor 属性,它通过原型链向上找到 Person.prototype.constructor。也就是说:
- 实例 person 自身:没有 own property 叫 constructor
- person.__proto__ 指向 Person.prototype
- 而 Person.prototype 上有 constructor: Person
- 所以 person.constructor 实际是读取原型上的这个属性
实例化过程中 constructor 的可见性
在 new 执行的四个步骤里,constructor 属性在第二步(建立原型连接)完成后即可访问:
- 第一步创建空对象 → 此时对象无 __proto__,也无 constructor
- 第二步设置 obj.__proto__ = Constructor.prototype → 原型链打通,constructor 可沿链访问
- 第三步执行构造函数体 → this.xxx 赋值,但不影响 constructor 指向
- 第四步返回对象 → 返回后,person.constructor 就能稳定读取到 Person
constructor 指向可能被改写
因为 constructor 是 prototype 上的一个普通属性,可以被显式修改,这会影响所有后续实例:
- Person.prototype.constructor = null → person.constructor 变为 null
- Person.prototype.constructor = Animal → person.constructor 指向 Animal
- 常见修复写法:Person.prototype.constructor = Person
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











