我在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中实现此目的的最佳方法是什么?感谢。
更新
我应该提到:我意识到糟糕的设计让我首先提出这个问题。 mixin是理想的,但我继承了代码,目前没有时间重构。
答案 0 :(得分: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');
}
});
答案 1 :(得分:1)
这可能对您不起作用,但......如果您将SomeClass1
添加为mixin并从doSomething
中删除SomeClass3
的本地定义,则调用方法{{ 1}}在实例上将直接调用doSomething
。
如果SomeClass3上的SomeClass1.doSomething();
需要运行本地/不同的代码但是你可以解决它,这可能不实用。
http://www.jsfiddle.net/29MGa/1/
必须有一种从第n级到达继承链的根目录的方法,但我无法帮助你。你应该去mootools邮件列表并发布这个帖子,希望核心团队的人能够回答(比如ryan florence,aaron newton,christoph pojer等)。另一个很好的来源是irc.freenode.net上的mootools irc频道#mootools。
祝你好运,请用你的发现更新一下,因为你不知道什么时候可能需要这个。从irc更新:
doSomething
<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
答案 2 :(得分:0)
我手边没有mootools来测试但是......
你试过吗
(this.parent()).parent();
?
答案 3 :(得分:0)
你能在祖父母班上打电话吗?
SomeClass1.doSomething.apply(this,arguments);
或者甚至可能:
SomeClass1.prototype.doSomething.apply(this, arguments);
我不是100%确定MooTools课程是如何工作的,但其中一个建议应该有效。
此外,如果您在SomeClass2中的doSomething()
中有功能,您不希望继承SomeClass3,为什么SomeClass2是父类?您应该能够使另一个类成为包含SomeClass2和SomeClass3所需功能的父类,然后允许每个类以自己的方式覆盖doSomething()
方法。