Как это сделать.прародитель() функций в MooTools?


Я построил класс в 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, дедушки, не выполняя никакого кода в Class2#doSomething(), родителе.

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

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

Обновление:

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

4 ответа:

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

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

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

Должен быть способ добраться до корня цепочки наследования с n-го уровня, но тут я ничем не могу вам помочь. вы должны пойти в список рассылки mootools и опубликовать это в надежде, что кто-то из основной команды ответит (например, Райан Флоренс, Аарон Ньютон, Кристоф пойер и т. д.). еще один хороший источник-это IRC-канал в MooTools #в 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

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

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');
    }
});

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

Вы пробовали

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

?

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

SomeClass1.doSomething.apply(this,arguments);

Или даже:

SomeClass1.prototype.doSomething.apply(this, arguments);
Я не на 100% уверен, как работают классы MooTools, но одно из этих предложений должно сработать.

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