Javascript 如何在Mootools中获得此.祖父母()功能?
我在Mootools中构建了一个类,并对其进行了两次扩展,这样就有了祖父母、父母和孩子的关系:Javascript 如何在Mootools中获得此.祖父母()功能?,javascript,mootools,Javascript,Mootools,我在Mootools中构建了一个类,并对其进行了两次扩展,这样就有了祖父母、父母和孩子的关系: var SomeClass1 = new Class({ initialize: function() { // Code }, doSomething: function() { // Code } }); var SomeClass2 = new Class({ Extends: SomeClass1, initialize: function() {
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
的子级,我需要从Class1
的祖父母调用doSomething()
方法,而不执行父级Class2#doSomething()
中的任何代码
我需要的是一个grandParent()
方法来补充Mootoolsparent()
,但它似乎不存在
在Mootools或纯JavaScript中实现这一点的最佳方法是什么?谢谢
更新:
我应该提到:我意识到糟糕的设计让我首先提出了这个问题。mixin很理想,但我继承了代码,目前没有时间进行重构。我手头没有mootools可供测试,但 你试过了吗
(this.parent()).parent();
? 这可能对你不起作用,但是。。。如果将
SomeClass1
添加为mixin,并从SomeClass3
中删除doSomething
的本地定义,则对实例调用方法doSomething
将调用SomeClass1.doSomething()代码>直接
如果某个类3上的doSomething
需要运行本地/不同的代码,那么这可能是不实际的,但是您可以解决这个问题
必须有一种方法可以从第n级到达继承链的根,但我不能帮你。你应该去mootools的邮件列表,希望核心团队中有人能回答(比如ryan florence、aaron newton、christoph pojer等)。另一个好的来源是irc.freenode.net上的mootools irc频道
祝你好运,请更新你的发现,因为你永远不知道什么时候可能需要这个
从irc更新:
SomeClass1.prototype.doSomething.apply(这个[,…])代码>
没有.parent()那么干净,但是Moo没有给你祖父母:)
此外,mixin还获得了各种各样的赞誉:
d_-mitar:我经常发现,如果我试图这样做,那么让2类或3类成为混音可能更有意义
但是是的,Akaidoot's应该有用
你能在祖父母课上说一下吗
SomeClass1.doSomething.apply(this,arguments);
甚至可能:
SomeClass1.prototype.doSomething.apply(this, arguments);
我不是100%确定MooTools类是如何工作的,但其中一个建议应该是可行的
另外,如果您在SomeClass2的doSomething()
中拥有不希望为SomeClass3继承的功能,为什么SomeClass2是父类?您应该能够使另一个类成为父类,该类包含SomeClass2和SomeClass3所需的功能,然后允许每个类以自己的方式重写doSomething()
方法。如前所述,我打赌在这里使用mixin更有意义,但现在开始吧
这仍然会导致父方法运行。感谢mixin建议。这对我来说是可行的,但是,我正在处理大量的现有代码,这些代码还有一些不尽如人意的地方,重构需要的时间比我现在愿意花的时间还要多。如果我找到一个解决方案,我一定会用它更新这个线程。酷,我在irc上问过,得到了一些想法,回答更新了
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');
}
});