如何在Mootools中获得this.grandparent()功能?

时间:2010-06-04 16:25:30

标签: javascript 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中实现此目的的最佳方法是什么?感谢。

更新

我应该提到:我意识到糟糕的设计让我首先提出这个问题。 mixin是理想的,但我继承了代码,目前没有时间重构。

4 个答案:

答案 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[, ...]);

另外,mixin也有各种各样的赞许:

<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()方法。