constructor属性默认由JavaScript引擎在函数创建时自动设于其prototype对象上,值为该函数本身,仅作标识用途,不参与new过程或原型链查找。

JavaScript 中 constructor 属性本身并不“关联”原型对象,而是**作为原型对象上的一个普通属性,通常指向创建该原型的构造函数**。它的存在是语言设计约定的结果,不是自动绑定的机制,也不影响原型链查找或实例化行为。
constructor 属性默认怎么来的?
当你用函数声明或表达式定义一个构造函数时,JavaScript 引擎会自动为它的 prototype 对象设置一个 constructor 属性,值就是该函数本身:
function Person(name) {
this.name = name;
}
// 此时 Person.prototype.constructor === Person(自动设置)
这个赋值发生在函数创建时,属于引擎内部操作,不是语法层面的强制规则。
它不是原型链的一部分,也不参与 new 过程
constructor 是原型对象上的一个可枚举属性(默认不可枚举,但存在),仅用于标识来源。它:
立即学习“Java免费学习笔记(深入)”;
- 不影响
new Person()的执行——真正起作用的是函数体和[[Prototype]]链接 - 不参与属性查找:访问
person.constructor实际是沿着原型链找到Person.prototype.constructor - 可以被手动修改或删除,不会破坏实例功能
手动修改 prototype 后容易丢失 constructor
常见陷阱:直接替换整个 prototype 对象,会导致 constructor 指向错误(比如指向 Object):
function Animal() {}
Animal.prototype = {
speak() { console.log('...'); }
};
// 此时 Animal.prototype.constructor === Object(不是 Animal!)
修复方法是在重写后手动恢复:
Animal.prototype.constructor = Animal;
或者更稳妥地,在对象字面量中显式定义:
Animal.prototype = {
constructor: Animal,
speak() { console.log('...'); }
};
ES6 class 中 constructor 的表现
类声明也会生成 constructor 属性,且不可删除、不可重新赋值(严格模式下会报错):
class Dog {}
Dog.prototype.constructor === Dog; // true
Object.defineProperty(Dog.prototype, 'constructor', { writable: false });
但注意:class 本质仍是函数,其 prototype 上的 constructor 依然只是标识用途,不是运行时必需项。


















