类链中的继承类型

时间:2012-04-12 16:22:37

标签: javascript inheritance

我创建this jsfiddle以显示我正面临的问题 我建议在继续阅读之前先看一下。

好的,现在我们准备好了。
如您所见,有一个类继承链:LeafDevice - > EndDevice - > SubNetDevice - > NetDevice - > Device。 当我实例化一个新的LeafDevice链时(即它以正确的顺序执行),但只设置LeafDeviceEndDevice的属性(查看控制台)。
当我运行更新方法时,它似乎每2跳一个类...我的意思是,你从输出中看到javascript似乎没有运行EndDevice.update()NetDevice.update()方法...仅来自DeviceSubNetDeviceLeafDevice的属性已更新/添加(再次,请查看控制台)...
这让我抓狂,因为我无法弄清楚我做错了什么!!
我要做的是在我定义的继承链之后实例化一个LeafDevice对象,以便最后它具有所有已定义的属性(myDeviceAttrmyNetDeviceAttr,{{1 }},mySubNetDeviceAttrmyEndDeviceAttr)。
你能否就这里发生的事情提出一些想法? 非常感谢你!!

1 个答案:

答案 0 :(得分:1)

这是您用来调用更新EndDevice& amp;期待update EndDevice出现

EndDevice.prototype.update.call(this, pDevice);

但是这里

EndDevice.prototype = new SubNetDevice;

您明确指定SubNetDevice的对象作为EndDevice的原型

因此,EndDevice.prototype.update相当于

var a = new SubNetDevice();
a.update()

因此,您无法在日志中看到update EndDevice

Net Device的原因也是一样。

尝试http://ejohn.org/blog/simple-javascript-inheritance/

上面链接中的扩展功能应解决您的问题

修复上面提到的小提琴,在LeafDevice中更改

EndDevice.prototype.update.call(this, pDevice);

LeafDevice.prototype.update.call(this, pDevice);

此更改是必需的,因为您需要调用LeafDevice的 - > EndDevice的 - >更新方法@ LeafDevice.prototype.update但不是EndDevice.prototype,这是EndDevice的 - > SubNetDevice的 - >更新方法

同样适用于所有课程

你错过了.call

SubNetDevice(this, pDevice);

这应该可以解决您的财产问题

http://jsfiddle.net/v6NsB/8/这是你的更新小提琴