我正在读一本关于OOP javascript的书,并且卡在其中一个例子上。
在示例代码的第一个版本中,创建了Shape
构造函数的新实例,并调用了toString
方法。 toString
方法返回“Triangle”,它是name
原型的Triangle
属性,即使“Shape”应该是{{1}的name
属性原型。
在示例代码的第二个版本中,Shape
方法按预期返回“Shape”。
我想知道第二版代码中的更改是如何产生差异的,因为在两个版本的示例代码中似乎都是toString
原型保存对Triangle
原型的引用所以{由于Shape
name
原型的{1}}属性仍会更新为“三角形”
第一个版本:jsfiddle
第二版:jsfiddle
答案 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不同的引用。