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