constructor是只读属性,指向构造函数prototype.constructor;重写prototype会丢失该指向,需手动恢复,否则影响instanceof判断;ES6 class自动维护,而旧式继承需显式修正。

构造函数的 constructor 属性本身不“互相映射”,它是一个只读引用,指向创建该对象的构造函数。所谓“映射”其实是开发者对原型链上 constructor 指向关系的主动维护或修复,核心在于:实例的 constructor 来自其原型(即 __proto__)上的 constructor,而这个值默认存在于构造函数的 prototype 对象中。
constructor 的真实来源是 prototype.constructor
每个实例对象没有自己的 constructor 属性,它通过原型链向上查找——最终落在 Constructor.prototype.constructor 上。也就是说:
new Person().constructor === Person.prototype.constructor-
Person.prototype.constructor默认就是Person,这是引擎自动设置的 - 一旦你用赋值方式重写整个
prototype(如Person.prototype = { ... }),这个默认关系就丢失了,因为新对象没有constructor属性,会继续沿原型链找到Object.prototype.constructor,结果变成Object
手动恢复 constructor 指向的两种常用方式
覆盖 prototype 后,必须显式补上 constructor,否则会影响 instanceof 判断和类型识别:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在对象字面量中直接声明:
Person.prototype = { constructor: Person, sayName() { return this.name; } }; - 赋值后单独添加:
Person.prototype = { sayName() { ... } };<br>Person.prototype.constructor = Person;
继承场景下 constructor 容易被覆盖
子类继承父类时,若直接把子类 prototype 设为父类实例(旧式继承),会导致子类原型的 constructor 指向父类:
立即学习“Java免费学习笔记(深入)”;
Child.prototype = new Parent(); // 此时 Child.prototype.constructor === Parent- 修复方法:赋值后立即修正
Child.prototype.constructor = Child; - ES6 class 继承自动处理了这点,
extends会保持子类constructor正确,无需手动干预
constructor 不可写,但 prototype 可改
注意:obj.constructor 是只读属性,不能直接赋值修改;真正能控制它的,是修改其原型对象上的 constructor 值。例如:
let p = new Person(); p.constructor = Array; // 无效,不会改变 p.constructor 的值Person.prototype.constructor = Array; // 有效,所有 new Person() 实例的 constructor 都变成 Array

















