类链中的继承类型

inheritance types in classes chain

本文关键字:继承 类型      更新时间:2023-09-26

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

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

这是您用来调用更新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

网络设备的原因也是一样的。

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

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

要修复上述小提琴,请在叶子设备更改中

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

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

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

这同样适用于所有课程

你也错过了.call

SubNetDevice(this, pDevice);

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

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