2010-06-04 2 views
4

Я построил класс в Mootools и расширить его в два раза, так что есть прародитель, родитель, и ребенок отношение:Как получить эту функцию .grandparent() в Mootools?

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, ребенок, мне нужно вызвать метод doSomething() из Class1, то grandparent, без выполнения какого-либо кода в Class2#doSomething(), родитель.

Что мне нужно, это метод grandParent() в дополнение к Mootools parent(), но, похоже, его не существует.

Каков наилучший способ сделать это в Mootools или в чистом JavaScript? Благодарю.

UPDATE:

Я должен отметить: я понял, что плохой дизайн оставил меня задать этот вопрос в первую очередь. Смешивание было бы идеальным, но я унаследовал код и не имел времени для рефакторинга на данный момент.

ответ

1

это, вероятно, не будет работать для вас, но ... если вы добавите SomeClass1 как примесь и удалить локальное определение doSomething из SomeClass3, то вызов метода doSomething на экземпляре будет вызывать SomeClass1.doSomething(); прямой.

Это может быть нецелесообразно, если ваш doSomething на SomeClass3 должен запускать локальный/отдельный код, но вы можете обойти его, возможно.

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

должен быть способ добраться до корня цепочки наследования от п-го уровня, но я не могу вам помочь. вы должны пойти в список рассылки mootools и опубликовать это в надежде, что кто-то из основной команды ответит (например, ryan florence, aaron newton, christoph pojer и т. д.). Другим хорошим источником является канал mootools irC#mootools на irc.freenode.net.

удачи, пожалуйста, обновите это своими выводами, поскольку вы никогда не знаете, когда это может понадобиться.

обновление от ИРЦ:

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

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

также Mixin получает большие пальцы сортов:

<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. Это будет работать для меня, однако, я работаю с большим количеством существующего кода, который оставляет желать лучшего, и рефактору потребуется больше времени, чем я готов дать его в данный момент. Я обязательно буду обновлять эту тему с помощью решения, которое я должен найти. –

+0

круто, я спросил об этом irc и получил некоторые идеи, ответьте обновленным –

0

Я не MooTools под рукой, чтобы проверить, но ...

Вы пробовали

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

?

+0

Это будет по-прежнему вызывать родительский метод, который будет работать. –

0

Не могли бы вы просто назвать это на классе дедушки и бабушки?

SomeClass1.doSomething.apply(this,arguments); 

Или, может быть, даже:

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

Я не уверен на 100%, как работают классы MooTools, но один из этих предложений должно работать.

Кроме того, если у вас есть функциональность в doSomething() внутри SomeClass2, которую вы не хотите наследовать для 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'); 
    } 
}); 
Смежные вопросы