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

Javascript 新实例的默认原型是什么?,javascript,Javascript,我不理解以下行为: 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

我不理解以下行为:

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属性的默认值是多少?它似乎是构造函数的原型属性的原型属性;e、 g.Foo.prototype.prototype


它在规范中的什么地方解释了这种行为?

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

因为foo.\uu proto\uuu==Bar,那么显然foo.\uu proto\uu.prototype=Bar.prototype


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

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

因为foo.\uu proto\uuu==Bar,那么显然foo.\uu proto\uu.prototype=Bar.prototype

foo对象没有.prototype属性,它在foo中查找和找到。因为对象的prototype是一个具有prototype属性的函数对象,这是您遗漏的

使用构造函数创建的对象的prototype属性的默认值是多少

未定义,除非您正在构造的是函数。prototype属性属于函数。如果实例对象在其prortype链中没有函数对象,即instanceObj instanceof function为false,则该实例通常不会具有prototype属性

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

它似乎是构造函数的原型属性的原型属性;e、 g.Foo.prototype.prototype

由于已将Foo.prototype指定给功能栏,因此只能通过行为查看。因此,当您尝试获取foo.prototype时,解释器会查找foo的prototype链,并在功能栏上找到prototype属性

特别是,foo.prototype===Bar.prototype是真的,因为:

为了获得foo.prototype,我们首先尝试从foo中获取prototype。 foo没有原型属性。 查找原型链:构建foo时,foo的[[prototype]]被设置为foo.prototype。记住,Foo.prototype是功能条。 在吧台上寻找原型。 成功定义了Bar.prototype。将其用于foo.prototype。 毫不奇怪,Bar.prototype等于Bar.prototype。 它在规范中的什么地方解释了这种行为

说明prototype属性用作其构造对象的[[prototype]]内部属性

步骤5-7详细说明了上述15.3.5.2中所述的确切程序

描述基于原型的一般继承,即,如果对象没有属性,请查看其[[prototype]],等等

使用构造函数创建的对象的prototype属性的默认值是多少

未定义,除非您正在构造的是函数。prototype属性属于函数。如果实例对象在其prortype链中没有函数对象,即instanceObj instanceof function为false,则该实例通常不会具有prototype属性

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

它似乎是构造函数的原型属性的原型属性;e、 g.Foo.prototype.prototype

由于已将Foo.prototype指定给功能栏,因此只能通过行为查看。因此,当您尝试获取foo.prototype时,解释器会查找foo的prototype链,并在功能栏上找到prototype属性

特别是,foo.prototype===Bar.prototype是真的,因为:

为了获得foo.prototype,我们首先尝试从foo中获取prototype。 foo没有原型属性。 查找原型链:构建foo时,foo的[[prototype]]被设置为foo.prototype。记住,Foo.prototype是功能条。 在吧台上寻找原型。 成功定义了Bar.prototype。将其用于foo.prototype。 毫不奇怪,Bar.prototype等于Bar.prototype。 它在规范中的什么地方解释了这种行为

说明prototype属性用作其构造对象的[[prototype]]内部属性 项目

步骤5-7详细说明了上述15.3.5.2中所述的确切程序

描述基于原型的一般继承,即,如果对象没有属性,请查看其[[prototype]],等等


你设置了Foo.prototype=Bar,为什么会是别的?@dandavis:OPs点是Bar=Foo.prototype,所以他/她正在可视化Foo.prototype==Foo.prototype.prototype.ahh。使用构造函数创建的对象的prototype属性的默认值是从该构造函数派生的空白对象。例如:新字符串将为您提供一个对象,该对象具有很少的自己的方法,但所有继承的String.prototype方法,如slice和bold。如果您将inst.bold与String.prototype.bold进行比较,它们应该是相同的。@dandavis,我不确定我们是否在同一页上。打开一个控制台,输入var x=newstring;console.logx.prototype;你会发现它实际上是未定义的。我相信你说的是对象的原型,而不是对象的原型属性。在Chrome中,这是_protou________________________________________;是一种完全错误的原型链接方式。它应该是Foo.prototype=新条;或者Foo.prototype=Object.createBar.prototype;。也许你已经知道了?你设置了Foo.prototype=Bar,为什么会是别的?@dandavis:OPs点是Bar=Foo.prototype,所以他/她正在可视化Foo.prototype==Foo.prototype.prototype.ahh。使用构造函数创建的对象的prototype属性的默认值是从该构造函数派生的空白对象。例如:新字符串将为您提供一个对象,该对象具有很少的自己的方法,但所有继承的String.prototype方法,如slice和bold。如果您将inst.bold与String.prototype.bold进行比较,它们应该是相同的。@dandavis,我不确定我们是否在同一页上。打开一个控制台,输入var x=newstring;console.logx.prototype;你会发现它实际上是未定义的。我相信你说的是对象的原型,而不是对象的原型属性。在Chrome中,这是_protou________________________________________;是一种完全错误的原型链接方式。它应该是Foo.prototype=新条;或者Foo.prototype=Object.createBar.prototype;。也许您已经知道了?如果构造对象的原型是构造函数的.prototype属性引用的对象,那么这一切都是有意义的。规范中有明确的详细说明吗?就这样。对于使用构造函数创建的对象,原型属性的默认值是多少?如果构造对象的原型是构造函数的.prototype属性引用的对象,那么这一切都是有意义的。规范中有明确的详细说明吗?就这样。对于使用构造函数创建的对象,原型属性的默认值是多少?是的,它没有定义。谢谢你的精彩解释。我现在觉得自己像个白痴,因为我没有检查foo.hasOwnPropertyprototype,看到它是假的。谢谢你的精彩解释。我现在觉得自己像个白痴,因为我没有检查foo.hasOwnPropertyprototype并看到它是假的。