2010-06-04 59 views
4

我已經建立了MooTools的一類,並延長了兩次,這樣是有祖父母,父母和子女的關係:如何在Mootools中獲得this.grandparent()功能?

var SomeClass1 = new Class({ 
    initialize: function() { 
    // Code 
    }, 
    doSomething: function() { 
    // Code 
    } 
}); 

var SomeClass2 = new Class({ 
    Extends: SomeClass1, 
    initialize: function() { 
    this.parent(); 
    }, 
    doSomething: function() { 
    this.parent(); 
    // Some code I don't want to run from Class3 
    } 
}); 

var SomeClass3 = new Class({ 
    Extends: SomeClass2, 
    initialize: function() { 
    this.parent(); 
    }, 
    doSomething: function() { 
    this.grandParent(); 
    } 
}); 

Class3,孩子,我需要從Class1調用doSomething()法,祖父母,而不執行Class2#doSomething()父母的任何代碼。

我需要的是grandParent()方法來補充Mootools parent(),但它似乎不存在。

在Mootools或純JavaScript中完成此操作的最佳方法是什麼?謝謝。

UPDATE:

我應該提到:我意識到,不良設計已經離開我,要問在首位這個問題。一個mixin將是理想的,但我繼承了代碼,並沒有時間進行重構。

回答

1

這個,如果你添加SomeClass1作爲一個混合和SomeClass3去除doSomething本地定義,然後調用實例上的方法doSomething將調用SomeClass1.doSomething();直接可能不會爲你工作,但...。

如果SomeClass3上的doSomething需要運行本地/獨立代碼,但您可以解決此問題,這可能不太實際。

http://www.jsfiddle.net/29MGa/1/

必須有獲得從N級繼承鏈的根的一種方式,但我不能幫助你。你應該去mootools郵件列表併發布這個信息,希望核心團隊的某些人能夠回答(如ryan florence,aaron newton,christoph pojer等)。另一個很好的來源是irc.freenode.net上的mootools irc頻道#mootools。

祝你好運,請用你的發現來更新,因爲你永遠不知道什麼時候可能需要這個。從IRC

更新:

<akaIDIOT> SomeClass1.prototype.doSomething.apply(this[, ...]);

<akaIDIOT> not as clean as .parent(), but Moo doesn't give you a grandparent :)

也混入得到了大拇指各種各樣的:

<rpflo> d_mitar: I've often found that if I'm trying to do that it might make more sense for class 2 or 3 to be a mixin

<rpflo> but yeah, akaIDIOT's should work

+0

感謝您的mixin建議。這對我很有用,但是,我正在處理大量現有的代碼,這些代碼有點不盡人意,重構需要的時間比我目前願意付出的時間要多。 我一定會更新此線程與解決方案,如果我找到一個。 – 2010-06-07 06:48:49

+0

酷,我問irc有關它,並得到了一些想法,回答更新 – 2010-06-07 14:18:56

0

我沒有手頭MooTools的測試,但...

你試過

(this.parent()).parent(); 

+0

這將仍然導致父類的方法來運行。 – 2010-06-04 22:00:26

0

你可以把它叫做祖父母班嗎?

SomeClass1.doSomething.apply(this,arguments); 

或甚至:

SomeClass1.prototype.doSomething.apply(this, arguments); 

我不是100%肯定MooTools的類是如何工作的,但這些建議應該工作。

另外,如果SomeClass2中的doSomething()功能不在SomeClass3中繼承,​​那麼SomeClass2爲什麼是父類?您應該能夠使另一個類成爲包含SomeClass2和SomeClass3所需功能的父類,然後允許每個類以其自己的方式覆蓋doSomething()方法。

2

正如前面提到的,我敢打賭,在這裏使用mixin更有意義,但在這裏你會走。

http://jsfiddle.net/rpflorence/24XJN/

var GrandParent = new Class({ 
    initialize: function(){ 
     console.log('init:GrandParent'); 
    }, 
    talk: function(){ 
     console.log('talk:GrandParent'); 
    } 
}); 

var Parent = new Class({ 
    Extends: GrandParent, 
    initialize: function(){ 
     this.parent(); 
     console.log('init:Parent'); 
    }, 
    talk: function(){ 
     console.log('talk:Parent'); 
    } 
}); 

var Child = new Class({ 
    Extends: Parent, 
    initialize: function(){ 
     this.parent(); 
     console.log('init:Child'); 
    }, 
    talk: function(){ 
     GrandParent.prototype.talk.apply(this); 
     console.log('talk:Child'); 
    } 
});