2013-03-05 139 views
0

調用父類方法,爲了在JavaScript中模仿古典,類似Java的類我有一個名爲 「createClass」功能方便的方法:的Javascript,從覆蓋方法

它有3個參數:
*名稱以及應該創建的構造函數的路徑。
*超類的路徑。 *使用類的方法的JavaScript對象。

例如:

myApp.createClass("myapp.core.JString", "myapp.core.BaseString", { 
    abc: function() { 
    ... 

首先,我創建一個構造函數

Cf = function() { 
... 

如果有一個超類( 「基地」 是父類的構造函數):

protoObj = new Base(); 
protoObj.constructor = Cf; 

現在,按照新課程的方法,我把它們放在protoObj上:
(「PROTOS」與「類」方法的對象)

for (name in protos) { 
    ???????????????????? 
    protoObj[name] = protos[name] 

但把方法給protoObj之前,我想爲 調用從覆蓋方法超類方法創造便利方法:

init: function() { 
    this.jstring_super_init(); 
... 

所以,這裏的問號是,我希望把下面的代碼: (classnameLast在這種情況下「的jstring」類路徑=>小寫=>最後一部分)

if ((typeof protos[name] === "function") && 
    (protoObj[name]) && 
    (typeof protoObj[name] === "function")) { 
    supername = classnameLast + "_super_" + name; 
    protoObj[supername] = XXXXXXXXXXXXX 

在多個X所在的地方,我嘗試了幾件事,但沒有成功。它應該調用被覆蓋的超類的方法。

提前感謝您的幫助

+0

超級方法應該調用什麼代碼? – Bergi 2013-03-06 10:32:32

回答

0

我想這對XXXXXXXXXXXX,和它的工作:

(function(name1, Base1){ 
    return function() { 
    Base1.prototype[name1].apply(this, arguments);                  
    }; 
})(name, Base); 

我在Firefox 19,螢火蟲1.11.2調試的 「jstring_super_init」 函數調用。

螢火蟲行爲非常奇怪,跳到錯誤的地方的代碼!

然後,我插入「console.log(this.cid);」超級初始化之後。

在超類的init方法中放置到「this」的cid在那裏!

使用谷歌瀏覽器版本25進行調試時,它跳轉到正確的功能!

0

也許你可以做這樣的事情:

for (name in protos) { 
    var super_function = ...; //wherever it comes from 
    protoObj[name] = protos[name]; 
    protos[name]._super = super_function; 
} 

然後,從功能中,你應該通過this._super有機會獲得超級功能。您甚至可以執行this._super.call(this, ...)以確保在this的上下文中調用超級函數。

希望我能正確理解你。另外,如果我可以提出建議,可能會有更簡單的方法來處理經典對象和繼承。如果你不想使用Typescript,至少可以嘗試使用它們的繼承模型(這很常見)。

http://pastebin.com/Z2kaXqEv

編輯:什麼幫助我用的是打字稿操場(http://www.typescriptlang.org/Playground/)。玩弄它和類的功能,看看它如何編譯爲Javascript。這將幫助你更好地理解你如何在Javascript中完成古典繼承。