Как получить функциональность this.grandparent () в Mootools? - PullRequest
4 голосов
/ 04 июня 2010

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

Мне нужен метод grandParent() для дополнения Mootools parent(), но похоже, чтоодин не существует.

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

ОБНОВЛЕНИЕ:

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

Ответы [ 4 ]

2 голосов
/ 07 июня 2010

Как упоминалось ранее, я уверен, что использование миксина имеет больше смысла, но здесь вы идете.

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');
    }
});
1 голос
/ 05 июня 2010

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

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

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

Должен быть способ добраться до корня цепочки наследования с n-го уровня, но я не могу вам там помочь. Вы должны зайти в список рассылки mootools и опубликовать его в надежде, что кто-то из основной команды ответит (например, Райан Флоренс, Аарон Ньютон, Кристоф Пойер и т. д.). Еще один хороший источник - irc канал mmtools #mootools на irc.freenode.net.

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

обновление от 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 голосов
/ 07 июня 2010

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

SomeClass1.doSomething.apply(this,arguments);

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

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

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

Кроме того, если в SomeClass2 есть функциональность doSomething(), которую вы не хотите наследовать для SomeClass3, почему SomeClass2 является родительским классом? Вы должны иметь возможность сделать другой класс родительским, который включает в себя функциональность, необходимую для SomeClass2 и SomeClass3, а затем разрешить каждому переопределять метод doSomething() по-своему.

0 голосов
/ 04 июня 2010

У меня нет под рукой mootools для тестирования, но ...

Вы пробовали

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

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...