Как это сделать.прародитель() функций в 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 ответа:
Это, вероятно, не будет работать для вас, но ... если вы добавляете
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'); } });
Не могли бы вы просто позвонить в класс дедушки и бабушки?
SomeClass1.doSomething.apply(this,arguments);
Или даже:
Я не на 100% уверен, как работают классы MooTools, но одно из этих предложений должно сработать.SomeClass1.prototype.doSomething.apply(this, arguments);
Кроме того, если у вас есть функциональность в
doSomething()
внутри SomeClass2, которую вы не хотите наследовать для SomeClass3, почему SomeClass2 является родительским классом? Вы должны быть в состоянии сделать другой класс, чтобы быть родительским классом, который включает в себя функциональность, необходимую как для SomeClass2, так и для SomeClass3, а затем позвольте каждому переопределить методdoSomething()
по-своему.