2015-04-22 104 views
0

我有一個繼承自其他2個對象的對象。DOJO中多繼承時調用超類的構造函數

我使用手動呼籲構造,因爲我想操縱我發送到超類的參數(見'-chains-'

define([...], function(...) { 
    return declare("myClass", [base1, base2], 
    { 
     "-chains-": 
    { 
     constructor: "manual" 
    }, 

    constructor: function (params) { 
     this.inherited(arguments, [ params.x, params.y, ... ]); // just for the example 
    } 
    }); 
}); 

的問題是,我在這裏做一些錯誤的語法因爲我的超類構造函數根本沒有被調用。

當我刪除-chains-this.inherited...超類構造函數被調用,但沒有我的參數操作。

找到解決方法

取而代之的this.inherited(...)myClass構造我們寫

base1.prototype.constructor.apply(this, [paramsForBase1]); 
base2.prototype.constructor.apply(this, [paramsForBase2]); 

但還是高興聽到道場方式

回答

0

沒有辦法道場我怕。自動構造函數繼承的主要優點是它將調用所有構造函數。

但是,如果你把它設置爲手動,那麼它將呼叫最後繼承類的列表構造。在你的情況下,base2的構造函數將被調用,但不是來自base1的構造函數。

原因是最終你的類只能有一種方法,所以如果base1base2都有相同的方法,那麼它會按照你提供繼承數組的順序覆蓋它們。這意味着它將首先包含,並且在下一步中它將被覆蓋base2.constructor


編輯

如果你不想自己手動調用所有基類的構造函數做,你可以創建一個循環。所有的基礎構造函數實際上都可以在元對象中使用。這是一個有點哈克,但this.constructor._meta.parents提供了所有構造函數的數組,所以你可以簡單地遍歷它,例如:

var inheritAllConstructors = function(object, arguments) { 
    for (var idx = 0; idx < object.constructor._meta.parents.length; idx++) { 
     object.constructor._meta.parents[idx].apply(object, arguments); 
    } 
}; 

然後你就可以使用它像這樣:

constructor: function(name) { 
    inheritAllConstructors(this, ["custom", "arguments"]); 
}, 

全例如可以在JSFiddle上找到:http://jsfiddle.net/n7wnvbu1/

+0

聽起來很有道理..謝謝。解決方法是:) –

+0

如果您不想手動調用所有構造函數,仍然有辦法檢索所有父項的數組,並使用'this.constructor._meta.parents'循環它們。那麼它仍然有點可重用。我編輯了我的答案與其他細節。 – g00glen00b

+1

是的,我已經深入到道場並看到了那些成員......但我不喜歡使用任何圖書館的未申報成員,因爲有一天他們會用新版本更改/刪除它,然後我將不得不處理它再次。但非常感謝你,你有很大的幫助 –