首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >新实例的默认原型是什么?

新实例的默认原型是什么?
EN

Stack Overflow用户
提问于 2013-07-24 10:34:07
回答 2查看 209关注 0票数 2

我不明白以下行为:

代码语言:javascript
运行
AI代码解释
复制
var Foo = function () {};
var Bar = function () {};
Foo.prototype = Bar;
var foo = new Foo();
console.log(foo.prototype === Bar.prototype); // true, but why?

我在规格中找不到任何关于使用构造函数创建的对象上prototype属性的默认值的信息。(我确实找到了规范的这一部分,其中提到,对于函数,prototype属性默认为new Object(),但没有提到使用构造函数创建的对象。)

所以,我的问题是双重的:

使用构造函数创建的对象的prototype属性的默认值是什么?(它似乎是构造函数的prototype属性的prototype属性;例如,Foo.prototype.prototype)

在规范中,它是如何解释这种行为的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-24 11:17:41

使用构造函数创建的对象的prototype属性的默认值是什么?

undefined,除非您正在构建的是一个函数。prototype属性属于函数。如果实例对象的prortype链中没有函数对象(即instanceObj instanceof Functionfalse),则实例通常不会具有prototype属性。

函数之所以具有prototype属性,是因为有一天任何函数都可能被用作构造函数。构造函数的prototype属性确定其构造的实例的[[Prototype]]内部属性。

(它似乎是构造函数的prototype属性的prototype属性;例如,Foo.prototype.prototype)

您只看到行为,因为您已经将Foo.prototype分配给函数Bar。因此,当您尝试获取foo.prototype时,解释器将查找foo的原型链,并在函数Bar上找到prototype属性。

尤其是,foo.prototype === Bar.prototype是真的,因为:

  1. 为了获得foo.prototype,我们首先尝试将prototypefoo中删除。
  2. foo没有prototype属性。
  3. 查找原型链:foo[[Prototype]]在构造foo时被设置为Foo.prototype (请记住,Foo.prototype是函数Bar)。
  4. 查找prototype on Bar
  5. 成功!定义为Bar.prototype。将其用于foo.prototype
  6. 毫不奇怪,Bar.prototype等于Bar.prototype

在规范中,它是如何解释这种行为的?

  • 15.3.5.2解释说,prototype属性用作其构造的对象的[[Prototype]]内部属性。
  • 13.2.2 (步骤5-7)详细说明了上面15.3.5.2中描述的确切过程。
  • 8.6.2描述了基于一般原型的继承(也就是说,如果一个对象没有属性,请查看它的[[Prototype]]等等)。
票数 2
EN

Stack Overflow用户

发布于 2013-07-24 11:11:23

构造对象的原型是构造函数的.prototype属性引用的对象。

因为foo.__proto__ === Bar,很明显是foo.__proto__.prototype = Bar.prototype

foo对象没有.prototype属性,它是在foo.__proto__中查找和发现的,因为对象的原型是一个具有prototype属性的函数对象,这就是您遗漏的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17842122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档