constructor 是原型对象与构造函数双向绑定的关键,指向构造函数自身;重写 prototype 会丢失该属性,需手动修复;它支持通过实例调用创建同类新对象,但比 instanceof 更易被篡改而失效。

constructor 属性不是“附带的标签”,而是原型对象与构造函数之间双向绑定关系的关键纽带。它既反映对象的来源,也参与实例化逻辑,但容易在原型操作中被意外切断。
constructor 指向谁?不是看对象,而是看原型对象
每个函数(包括构造函数)创建时,其 prototype 属性会自动获得一个 constructor 属性,且该属性默认指向函数自身:
-
function Person() {}→Person.prototype.constructor === Person为 true - 由
new Person()创建的实例(如const p = new Person()),其p.constructor并非直接写死,而是通过原型链向上查找到Person.prototype.constructor得到的 - 所以:实例没有自己的
constructor,它继承自原型对象;真正决定constructor值的,是构造函数的prototype对象中的那个属性
重写 prototype 时,constructor 会“丢失”
当用字面量方式整体替换原型对象(比如 MyClass.prototype = { method() {} }),新对象是普通对象,它的 constructor 默认指向 Object,不再关联原构造函数:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
-
MyClass.prototype = { say() { } };→MyClass.prototype.constructor === Object(✅ 实际结果) - 后续创建的实例
new MyClass(),其.constructor也会变成Object,导致类型识别和instanceof判断失准 - 修复方法:手动补回
constructor:MyClass.prototype = { constructor: MyClass, say() { } };或更稳妥地:MyClass.prototype.constructor = MyClass;
constructor 不只是“读取用”,还能用于创建新实例
因为 obj.constructor 指向的是构造函数,所以可直接调用它来生成同类新对象:
-
const p1 = new Person('Alice');→const p2 = new p1.constructor('Bob');是合法且常见的模式 - 这在工厂函数、克隆逻辑、或泛型工具方法中很有用,比如:
function clone(obj) { return new obj.constructor(...getArgs(obj)); } - ⚠️ 注意:若
constructor被篡改或指向错误函数(如被覆盖为Object),这种用法将失效甚至出错
constructor 与 instanceof 的协作与差异
两者都用于类型判断,但机制不同:
-
obj instanceof Constructor检查的是obj.__proto__链是否包含Constructor.prototype -
obj.constructor === Constructor只比对原型对象上的constructor属性值,不涉及整条原型链 - 因此:
instanceof更健壮(支持继承链),而.constructor更直接但也更脆弱(易被覆盖) - 例如:若子类未修正
Child.prototype.constructor,则new Child().__proto__.constructor仍指向父类,但new Child() instanceof Child仍为 true










