私は 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 オブジェクトを参照していることを少なくとも私には暗示しているように見えます。関数内では、現在のメソッドが自動的に検索され、最初にオーバーライドされたメソッドが呼び出されます。