constructor是原型对象上默认自带的属性,值为对应构造函数,由引擎在函数创建时自动设置;它仅作类型标识,不参与new过程或原型链查找,也不被隐式调用。
JavaScript 中没有“constructor 的隐式调用”这一说法——constructor 本身不会被自动调用,它只是原型对象上的一个属性,指向构造函数。真正会被隐式关联或自动设置的,是 prototype 和 __proto__ 的关系,而 constructor 是这个关系中“附带存在”的引用。
constructor 是每个函数的 prototype 对象上**默认自带的属性**,值为该函数自身。它不是语言运行时“调用”的东西,而是一个指针,用于标识“谁造出了我”。
prototype 添加 constructor: 指向该函数
function Person() {} → Person.prototype.constructor === Person(为 true)constructor 属性,但可通过原型链访问:new Person().__proto__.constructor === Person
当手动重写函数的 prototype 时,constructor 会丢失,必须显式恢复,否则会破坏原型链的可追溯性。
Person.prototype = { say() { } }; → 此时 Person.prototype.constructor 指向 Object,不再是 Person
Person.prototype = { say() {}, constructor: Person };
Object.defineProperty(Person.prototype, 'constructor', { value: Person, enumerable: false })(避免遍历时暴露)它虽不参与执行逻辑,但在以下场景有实际作用:
立即学习“Java免费学习笔记(深入)”;
obj.constructor.name 获取类型名constructor 来重建实例constructor,防止丢失箭头函数不是构造函数,不能用 new 调用,因此它没有 prototype 属性,自然也不存在 constructor。试图访问 arrowFn.prototype 得到 undefined,访问 arrowFn.constructor 实际读取的是 Function.prototype.constructor(即 Function)。