JavaScript で追加機能を使用して基本クラスを拡張する必要があります。ここでは例として backbone.js の継承を使用していますが、これはクラスの拡張に関する一般的な質問です。
http://addyosmani.github.com/backbone-fundamentals/#inheritance-mixins
Parent = Backbone.View.extend({
value: "Parent value",
func: function(){
alert('Parent function, ' + this.value);
}
});
Child = Parent.extend({
value: "Child value",
func: function(){
alert('Child function, ' + this.value);
},
test: function(){
this.constructor.__super__.func.call(this);
//Parent.prototype.func.call(this)
}
});
var child = new Child();
child.test();
// prints: Parent function, Child value
// should print: Parent function, Parent value
実験を容易にするためのjsfiddleサンドボックスを次に示します。
問題は、extend() が継承ではなくインターフェイスの実装のように機能するように見えることです。したがって、子は実際には親のままですが、追加のメンバー関数があります。「値」メンバーは仮想のように見えるため、子孫ごとに 1 つではなく、インスタンスが 1 つしかありません。C++ では、Parent::func() と言うことができ、内部では、this->value は「親の値」になります。
backbone.js に対してさまざまな ._super 拡張機能を試しましたが、それらはすべて、「これ」が親の間違ったコンテキストであるという問題に悩まされています。また、子/親のいずれか/両方で _.bindAll() を試しましたが、同じ理由で失敗します:
initialize: function() {
_.bindAll(this, 'func');
}
「これ」をjavascriptの親で適切なコンテキストにする、または少なくとも最小限のコードでその機能をシミュレートする最もクリーンな方法は何ですか?
Child に「親」メンバーを作成し、それをインスタンス化して、子孫ごとに「値」メンバーを作成する必要がありますか?