一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JavaScript 中 constructor 的隐式调用和显式定义

时间:2026-07-05 11:42:02 编辑:袖梨 来源:一聚教程网

constructor是原型对象上默认自带的属性,值为对应构造函数,由引擎在函数创建时自动设置;它仅作类型标识,不参与new过程或原型链查找,也不被隐式调用。

JavaScript 中没有“constructor 的隐式调用”这一说法——constructor 本身不会被自动调用,它只是原型对象上的一个属性,指向构造函数。真正会被隐式关联或自动设置的,是 prototype__proto__ 的关系,而 constructor 是这个关系中“附带存在”的引用。

constructor 是什么?它从哪来?

constructor 是每个函数的 prototype 对象上**默认自带的属性**,值为该函数自身。它不是语言运行时“调用”的东西,而是一个指针,用于标识“谁造出了我”。

  • 定义函数时,引擎自动为其 prototype 添加 constructor: 指向该函数
  • 例如:function Person() {}Person.prototype.constructor === Person(为 true
  • 实例对象本身没有 constructor 属性,但可通过原型链访问:new Person().__proto__.constructor === Person

显式定义 constructor 的常见场景

当手动重写函数的 prototype 时,constructor 会丢失,必须显式恢复,否则会破坏原型链的可追溯性。

  • 错误写法:Person.prototype = { say() { } }; → 此时 Person.prototype.constructor 指向 Object,不再是 Person
  • 正确补救:Person.prototype = { say() {}, constructor: Person };
  • 更稳妥写法:Object.defineProperty(Person.prototype, 'constructor', { value: Person, enumerable: false })(避免遍历时暴露)

为什么 constructor 重要?

它虽不参与执行逻辑,但在以下场景有实际作用:

立即学习“Java免费学习笔记(深入)”;

  • instanceof 判断依赖原型链,但调试或序列化时常需通过 obj.constructor.name 获取类型名
  • 类库中做类型检查、克隆、反序列化时,常读取 constructor 来重建实例
  • ES6 class 编译成 ES5 后,Babel 等工具会主动修复 constructor,防止丢失

注意:箭头函数没有 prototype,也没有 constructor

箭头函数不是构造函数,不能用 new 调用,因此它没有 prototype 属性,自然也不存在 constructor。试图访问 arrowFn.prototype 得到 undefined,访问 arrowFn.constructor 实际读取的是 Function.prototype.constructor(即 Function)。

热门栏目