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