2

我正在阅读一本关于 OOP javascript 的书,但遇到了其中一个示例。

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

在示例代码的第二个版本中,该toString方法按预期返回“Shape”。我想知道代码的第二个版本中的更改有何不同,因为在示例代码的两个版本中,Triangle原型都包含对原型的引用,因此Shape原型的name属性Shape仍将更新为“三角形“ 因为Triangle.prototype.name = "Triangle";

第一个版本:jsfiddle

第二个版本:jsfiddle

4

2 回答 2

1

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

我在这里做了一些改变。希望它可以帮助您理解,请参阅控制台。

于 2012-04-08T02:58:06.877 回答
0

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

于 2012-04-08T01:41:17.113 回答