2

我正在玩 Mootools 类继承等,我正在尝试使用 .parent 属性调用基类覆盖的方法(对于长代码片段)。

var app = this.app = {},
    //ultimate base class
    Animal = new Class({
        initialize : function(param){
            this.age = param.age;
            this.name = param.name;
        },
        doStuff : function(param){
            alert("animal doStuff");
        }
    }),
    //herbivore functionality
    HerbivoreBehaviour = new Class({
        eat : function(){
            alert('Plants are scrumptious');
        }
    }),
    //carnivore functionality
    CarnivoreBehaviour = new Class({
        eat : function(){
            alert('Meat tastes gooood');
        }
    })
    //mammal base class
    Mammal = new Class({
        Extends : Animal,
        initialize : function(param){
            this.parent(param);
            this.numberOfNipples = param.numberOfNipples;
        },
        doStuff : function(){
            alert("mammal doStuff");
            this.doStuff.parent();
        }
    }),
    //reptile base class
    Reptile = new Class({
        Extends : Animal,
        initialize : function(param){
            this.parent(param);
            this.numberOfScales = param.numberOfScales;
        },
        doStuff : function(){
            alert('reptile doStuff');
            this.doStuff.parent();
        }
    }),
    //final top class animal->mammal-cow!
    //and it's a herbivore
    Cow = new Class({
        Extends : Mammal,
        Implements : HerbivoreBehaviour,
        initialize : function(param){
            this.parent(param);
            this.isMooCrazy = param.isMooCrazy;
        },
        doStuff : function(){
            alert('I am a cow');
            this.doStuff.parent();
        }
    }),
    //final top level class animal->reptile->mutantLizard!
    //and it's a carnivore
    MutantLizard = new Class({
        Extends : Reptile,
        Implements : CarnivoreBehaviour,
        initialize : function(param){
            this.parent(param);
            this.isDestroyingEverything = param.isDestroyingEverything;
        },
        doStuff : function(){
            alert('STOMP STOMP STOMP CRRRRRASH');
            this.doStuff.parent();
        }
    });

    app.run = function(){
        var daisy = new Cow({
                name : 'Daisy',
                age : 2,
                numberOfNipples : 6,
                isMooCrazy : true
            }),
            godzilla = new MutantLizard({
                name : 'Godzilla',
                age : 1123,
                numberOfScales : 123456,
                isDestroyingEverthing : true
            });

        daisy.eat();
        godzilla.eat();
        daisy.doStuff();
        godzilla.doStuff();
    };

daisy.eat() 和 godzilla.eat() 的当前输出是正确的,但是在 daisy.doStuff() 的第一个打印语句之后执行停止,然后它不会调用 daisy 父类 doStuff() 方法,这就是我希望。你能告诉我我怎么会这样称呼 doStuff 吗?

更新:

我设法通过用 this.parent() 替换 this.doStuff.parent() 来修复他的调用顺序。然而,这引发了关于“this”指的是什么的问题。我认为这将是该类的实际实例,即。daisy 或 godzilla,但在 doStuff 方法中使用 this.parent() 似乎至少对我来说意味着“this”指的是它当前在其中的实际 Function 对象,除非调用 parent() 方法在函数内部会自动查找您所在的方法并调用它的第一个覆盖方法。

4

1 回答 1

3

对。基本上,一切都很好,这就是好消息。唯一需要的改变是把你换this.doStuff.parent()this.parent()周围。

http://jsfiddle.net/dimitar/njQBN/

似乎工作正常。

this.doStuff.parent()开始并不是很干,而且它还引用了一个本地属性——在一个用相同方法扩展和实现其他人的类的上下文中——同时,会产生……意想不到的结果。

于 2012-06-13T08:39:27.823 回答