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() からの最初の print ステートメントの後に実行が停止し、その後、デイジーの親クラスの doStuff() メソッドが呼び出されません。願っています。このように doStuff を呼び出す方法を教えてください。

アップデート:

this.doStuff.parent() を this.parent() に置き換えることで、彼の呼び出しシーケンスを修正することができました。しかし、これは「これ」が何を指しているのかという疑問を提起しました。クラスの実際のインスタンスになると思いました。デイジーまたはゴジラですが、doStuff メソッドでの this.parent() の使用は、parent() メソッドを呼び出さない限り、「これ」が現在内部にある実際の Function オブジェクトを参照していることを少なくとも私には暗示しているように見えます。関数内では、現在のメソッドが自動的に検索され、最初にオーバーライドされたメソッドが呼び出されます。

4

1 に答える 1

3

右。まあ基本的には、すべてが良いです、それは良いニュースです. 必要な唯一の変更は、すべてを交換するthis.doStuff.parent()ことですthis.parent()

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

うまくいくようです。

行うことthis.doStuff.parent()は、そもそもあまり DRY ではなく、ローカル プロパティも参照します。これは、同じメソッドで他のクラスを拡張および実装するクラスのコンテキストでは、同時に ... 予期しない結果をもたらします。

于 2012-06-13T08:39:27.823 に答える