[[Prototype]]旁的名称含义及继承显示父构造函数名的原因
理解[[Prototype]]属性旁的名称含义
[[Prototype]]旁边显示的名称,本质是该原型对象的constructor属性指向的构造函数的name值,不是固定的“类名”,这也是你困惑的核心原因,具体拆解:
- 常规场景下,普通对象的[[Prototype]]显示为
Object,是因为Object.prototype.constructor指向Object,取它的name属性值"Object",这符合你最初的认知。 - 但如果修改了原型对象的
constructor,这个名称会直接变化:// 自定义构造函数 function Person() {} let p = new Person(); // p的[[Prototype]]显示为Person —— 因为Person.prototype.constructor === Person // 替换原型对象,且未显式设置constructor Person.prototype = { sayHi: () => console.log('hi') }; let p2 = new Person(); // 此时p2的[[Prototype]]显示为Object —— 因为新原型对象的constructor默认指向Object - 用
Object.create()创建的对象也同理:// 基于Array.prototype创建对象 let arrLike = Object.create(Array.prototype); // arrLike的[[Prototype]]显示为Array —— 因为Array.prototype.constructor是Array - 极端情况:如果原型对象的
constructor指向匿名函数,或者被设为非函数值,浏览器调试工具会显示anonymous或者 fallback 到Object(取决于工具实现)。
总结:这个名称是动态的,完全由当前原型对象的constructor属性决定,不是对象的“固有类名”。
内容的提问来源于stack exchange,提问作者Vonot
相关产品推荐
相关产品推荐

