私は可能な限り簡単な方法で継承を実装しようとしています。JSの継承がプロトタイプベースであることは知っていますが、OOクラスベースの言語に習熟しているため、「クラス」ロジックを「コンストラクター」関数にカプセル化したままにすることに偏っています。また、プロトタイプオブジェクトで新しいメンバーを定義することは避けようとしました。そのコードは、「クラス」関数の外に配置する必要があるためです。これが私が試したことです:
function Car(color, year, plate) {
this.color = color;
this.year = year;
this.plate = plate;
this.hasFuel = true;
this.fuel = 100;
this.run = function(km) {
this.fuel = this.fuel - km*this.getFuelConsumptionRate();
if(this.fuel < 0){
this.fuel = 0;
}
if(this.fuel == 0){
this.hasFuel = false;
}
};
this.getFuelConsumptionRate = function(){
return 4.2;
};
}
function EfficientCar(color, year, plate, weight){
//Emulating a super call
Car.call(this, color, year, plate);
this.weight = weight;
//Overriden method
this.getFuelConsumptionRate = function(){
return 2.2;
};
}
//Inheritance
//(I don't like this out of the method, but it is needed for the thing to work)
EfficientCar.prototype = Car;
EfficientCar.prototype.constructor = EfficientCar;
このコードは期待どおりに機能します。同じ数kmの走行を呼び出した後、効率的な車にはより多くの燃料が残っています。しかし、オーバーライドされた子バージョン内で関数の親バージョンを使用したいと思います。このようなもの:
function EfficientCar(color, year, plate, weight){
//Emulating a super call
Car.call(this, color, year, plate);
this.weight = weight;
this.getFuelConsumptionRate = function(){
return super.getFuelConsumptionRate() / 2; //If only I could do this...
};
}
クラスのようにこれを達成する方法はありますか?Car
とEfficientCar
クラスの中にほとんどすべてのものを入れたいのですが、申し訳ありませんが、関数です。