0

我创建了这个 jsfiddle来展示我面临的问题。
我建议在继续阅读之前先看看它。

好的,现在我们准备好了。
如您所见,有一个类继承链:LeafDevice-> EndDevice-> SubNetDevice-> NetDevice-> Device。当我实例化一个新LeafDevice的链时(即它以正确的顺序执行),但只有来自LeafDevice和的属性EndDevice被设置(查看控制台)。
当我运行 update 方法时,它似乎每 2 跳一个类...我的意思是,您从输出中看到 javascript 似乎没有运行EndDevice.update()and方法...只有来自,和的NetDevice.update()属性被更新/添加(再次,看看控制台)...... 这让我发疯,因为我无法弄清楚我做错了什么! 我想要做的是实例化一个DeviceSubNetDeviceLeafDevice

LeafDevice遵循我定义的继承链的对象,以便在最后它具有所有定义的属性(myDeviceAttr, myNetDeviceAttr, mySubNetDeviceAttr, myEndDeviceAttr, myLeafDeviceAttr)。
你能就这里发生的事情提供一些想法吗?
非常感谢!!

4

1 回答 1

1

这是您用来调用更新 EndDevice 并期望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's -> EndDevice's -> Update 方法,该方法可用 @LeafDevice.prototype.update但此处不可用EndDevice.prototype,即 EndDevice's -> SubNetDevice's -> Update 方法

这同样适用于您的所有课程

你也错过.call

SubNetDevice(this, pDevice);

这应该可以解决您的属性问题

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

于 2012-04-12T17:32:49.193 回答