0

我需要在 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');
}
  1. 让“this”成为javascript中Parent中的正确上下文的最简洁方法是什么,或者至少用最少的代码模拟该功能?

  2. 我是否需要在 Child 中创建一个“父”成员并实例化它以为每个后代创建“值”成员?

4

0 回答 0