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

prototype confusion: parent prototype property affected by child prototype

本文关键字:原型 属性 影响      更新时间:2023-09-26

我正在读一本关于OOP javascript的书,却被困在其中一个例子上。

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

在示例代码的第二个版本中,toString 方法按预期返回"Shape"。我想知道代码第二版中的更改如何产生任何影响,因为似乎在示例代码的两个版本中,Triangle原型都包含对Shape原型的引用,因此Shape原型的name属性仍将更新为"三角形"

,因为Triangle.prototype.name = "Triangle";

第一个版本:JSFIDDLE

第二个版本:JSFIDDLE

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

在这里做了一些更改。希望它能帮助您理解,请在控制台中查看。

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