2012-04-12 72 views
0

我创建了this jsfiddle来显示我面临的问题。
我建议在阅读之前先看看它。继承类别链

好吧,现在我们已经准备好了。
正如你所看到的,有一个类继承链:LeafDevice - >EndDevice - >SubNetDevice - >NetDevice - >Device。 当我实例化一个新的LeafDevice链完成(即它按正确的顺序执行),但仅设置了LeafDeviceEndDevice的属性(查看控制台)。
当我运行的更新方法似乎跳级,每2 ...我的意思是,你的JavaScript似乎并没有运行EndDevice.update()NetDevice.update()方法的输出看到...从DeviceSubNetDevice和属性唯一LeafDevice更新/添加(再次,看看控制台)...
这让我疯狂,因为我无法弄清楚我做错了什么!
我想要做的就是实例下面我定义继承链中的一个LeafDevice对象,以便在年底它拥有所有定义的属性(myDeviceAttrmyNetDeviceAttrmySubNetDeviceAttrmyEndDeviceAttrmyLeafDeviceAttr)。
你可以提出一些关于这里发生了什么的想法吗?
非常感谢你!

回答

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是网络设备一样了。

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

在链路EXTEND函数上述应解决乌尔问题

要解决上面提到的小提琴,在LeafDevice变化

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

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

这个变化是必需的,因为,你是预期的泰德打电话LeafDevice的 - > EndDevice的 - >更新方法,它可@LeafDevice.prototype.update但不是在这里EndDevice.prototype这是EndDevice的 - > SubNetDevice的 - > Update方法

这同样适用于所有的类

你也错过了.call

SubNetDevice(this, pDevice); 

这应该可以解决你的问题性质

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

+0

我认为脚本不是很好,因为在我的测试中,它不能使用具有一个或多个参数的方法。如果您有相反的证据,请展示一个实例,我将使用它。无论如何,我会很高兴不使用这种脚本,并使用JavaScript的自然环境行为(我知道它可以制作)!我不打算接受这个答案,因为它没有清楚地表明如何解决问题(直到你详细阐述了一下,对不起) – andreapier 2012-04-12 20:25:02

+0

@andreapier我已经在小提琴中修正了你的脚本,看看它。我没有得到你真正想做的事情。你的问题缺乏正确的解释。昨天我回答说:“这让我疯狂,因为我无法弄清楚我做错了什么”现在我已经更新了脚本,按照预期工作 – Tamil 2012-04-13 07:12:56

+0

好吧,现在更新方法按预期工作,但构造函数不会。 。如果你看得更深,你可以看到LeafDevice对象只有myEndDeviceAttr和myLeafDeviceAttr ...它没有mySubNetDeviceAttr,myNetDeviceAttr和myDeviceAttr。 @Tamil – andreapier 2012-04-13 07:38:44