最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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)。
相关文章
- 高德地图路线规划显示异常怎么办 07-09
- 漫蛙漫画官方版正版ios如何安装 07-09
- 胖东来官网地址-胖东来官方网站入口地址 07-09
- investopedia官网中文版入口-investopedia国内能用的官方网页版入口地址 07-09
- 一点文学txt小说网站入口-一点文学小说官网入口地址2026最新 07-09
- 易校园怎么绑定微信 07-09