类链中的继承类型
inheritance types in classes chain
我创建了这个jsfiddle来显示我面临的问题。
我建议在继续阅读之前先看一下。
好的,现在我们准备好了。
如您所见,有一个类继承链:LeafDevice
-> EndDevice
-> SubNetDevice
-> NetDevice
-> Device
。当我实例化一个新LeafDevice
时,链被完成(即它以正确的顺序执行),但只设置了来自LeafDevice
和EndDevice
的属性(查看控制台)。
当我运行更新方法时,它似乎每 2 个跳一个类......我的意思是,你从输出中看到javascript似乎没有运行EndDevice.update()
和NetDevice.update()
方法......仅更新/添加来自Device
、SubNetDevice
和LeafDevice
的属性(再次查看控制台)...
这让我发疯,因为我无法弄清楚我做错了什么!!
我试图做的是实例化一个遵循我定义的继承链的LeafDevice
对象,以便最后它具有所有定义的属性(myDeviceAttr
、myNetDeviceAttr
、mySubNetDeviceAttr
、myEndDeviceAttr
、myLeafDeviceAttr
)。
你能谈谈这里发生了什么吗?
非常感谢!!
这是您用来调用更新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/这是您更新的小提琴
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 如何在DOM元素上按类型构建此函数
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何从querySelectorAll中获取按钮类型
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何将具有文本类型值的var放入jQuery函数中
- javascript解释器如何理解变量的数据类型
- 可变大小的JavaScript字符串如何成为基元类型
- AngularJS指令只识别双向绑定类型
- Node.js中依赖于版本的类型继承
- JavaScript中的原型继承是否演示了类型多态性
- 继承和 TypeScript 错误:X 不是构造函数类型
- 类链中的继承类型
- 复杂的循环节点模块依赖抛出“类型错误:'继承'的超级构造函数必须有一个原型”
- 这两种类型的继承有什么区别?
- Javascript继承:子类型原型不能访问超类型的属性/函数
- 在Javascript原型继承中,数组和数字数据类型之间有区别吗
- 如何使用JSON创建从对象类型继承的对象