我正在研究一個類似於通過基於原型的繼承創建的類層次結構的web應用程序。我們不斷地爲一個共同的祖先「類」添加功能,所以它的構造函數簽名不斷擴展。在Javascript中遞歸調用「父」構造函數?
每次我們改變祖先的簽名時,我們也必須將更改傳播給下屬的構造函數。這顯然是一個可維護性問題,所以我創建了一個函數,用於從arguments
對象中提取父項的參數,並使用Function.apply()
調用父項。
的代碼看起來是這樣的:
BaseClass.prototype._super = function(args) {
args = Array.prototype.slice.call(args, this.constructor.length);
this.parentConstructor.apply(this, args);
};
像這樣使用:
function Child(child_arg1, child_arg2 /*, implicit parent args */) {
this._super(arguments);
}
(我不能使用arguments.caller.arguments
因爲代碼是嚴格模式 this.parentConstructor
由功能設置。構建類的層次結構)。
不幸的是,這隻適用於一個級別的繼承:例如,如果A的父類B有它自己的父類C,當B呼叫_super
時,this.parentConstructor
仍然指向B,這意味着B將最終以無限循環呼叫自己。
如果我將parentConstructor字段與構造函數Functions對象(而不是原型)一起存儲,則必須傳入當前的調用函數。這將使線路調用超緊密耦合到周圍的功能,我試圖避免。
因此,有沒有人知道任何更好的方法?
你是什麼意思「超緊密耦合到周圍的功能」?從Child構造函數調用'this._super(Child,arguments)'應該沒有問題,是嗎? – Bergi 2012-04-27 11:08:27
我只是希望能夠將相同的代碼行復制並粘貼到所有子構造函數中,而無需對其進行更改。就像我在Java中所做的一樣... – 2012-04-27 15:05:45