原型混淆:父子原型属性受子原型影响

时间:2012-04-08 01:27:54

标签: javascript oop prototype

我正在读一本关于OOP javascript的书,并且卡在其中一个例子上。

在示例代码的第一个版本中,创建了Shape构造函数的新实例,并调用了toString方法。 toString方法返回“Triangle”,它是name原型的Triangle属性,即使“Shape”应该是{{1}的name属性原型。

在示例代码的第二个版本中,Shape方法按预期返回“Shape”。 我想知道第二版代码中的更改是如何产生差异的,因为在两个版本的示例代码中似乎都是toString原型保存对Triangle原型的引用所以{由于Shape

name原型的{1}}属性仍会更新为“三角形”

第一个版本:jsfiddle

第二版:jsfiddle

2 个答案:

答案 0 :(得分:1)

在第二个示例中,当您分配了Triangle.prototype = new F();时,我们创建了F function的新实例并继承了Shape的原型,这意味着Triangle.prototype中的任何更改都将反映在该对象实例中,但不反映在F's constructor中,因为对象实例不能更改它的构造函数,但如果更改constructor's prototype/Shape.prototype,那么由该构造函数创建的任何对象也将反映出来。但如果你被分配Triangle.prototype = F.prototype,那可能会有所不同。

我做了一些更改here。希望它能帮助你理解,在控制台中看到。

答案 1 :(得分:0)

在第二个例子中,Triangle.prototype获得一个新的引用 - 新的F()。因此,与第一个示例不同,Triangle.prototype实际上是与Shape.prototype不同的引用。