我需要在 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() 似乎更像接口实现而不是继承。所以 Child 仍然是 Parent,但是有额外的成员函数。“值”成员似乎是虚拟的,因此它只有一个实例,而不是每个后代一个。在 c++ 中,我可以说 Parent::func() 在里面,this->value 将是“父值”。
我已经尝试了各种 ._super 对主干.js 的扩展,但它们仍然受到“this”是 Parent 中错误上下文的影响。我也尝试过 _.bindAll() 在 Child/Parent 中的一个/两个中,但由于同样的原因它失败了:
initialize: function() {
_.bindAll(this, 'func');
}
让“this”成为javascript中Parent中的正确上下文的最简洁方法是什么,或者至少用最少的代码模拟该功能?
我是否需要在 Child 中创建一个“父”成员并实例化它以为每个后代创建“值”成员?