在Backbone中访问父类


69

我需要initialize从继承的MyModel-class内部调用父类的方法,而不是像我今天所做的那样完全覆盖它。

我该怎么办?

这是我的代码现在的外观:

BaseModel = Backbone.Model.extend({
    initialize: function(attributes, options) {
        // Do parent stuff stuff
    }
});

MyModel = BaseModel.extend({
    initialize: function() {
        // Invoke BaseModel.initialize();
        // Continue doing specific stuff for this child-class.
    },
});

Answers:


52
MyModel = BaseModel.extend({
    initialize: function() {
        MyModel.__super__.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});

1
@Industrial那么它在做一些愚蠢的事情。试试this.__super__.initialize.apply(this, arguments);
雷诺斯(Raynos)2012年

5
__ super __并不打算直接使用它,如带下划线的名称所示。
Yury Tarabanko 2012年

5
@Raynos:为什么不BaseModel.prototype.initialize.apply(this, arguments);呢?这应该工作没有__super__
Yury Tarabanko 2012年

6
documentcloud.github.com/backbone/#Model-extend关于super的简要说明:JavaScript没有提供一种简单的方法来调用super-在原型链的较高位置定义的具有相同名称的功能。如果您覆盖诸如set或save之类的核心功能,并且想要调用父对象的实现,则必须显式调用它……
Yury Tarabanko 2012年

4
FWIW杰里米阿什克纳斯状态__super__不适合直接使用。
MikeSchinkel

130

尝试

MyModel = BaseModel.extend({
    initialize: function() {
        BaseModel.prototype.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});

即使在存在_.bindAll(this)调用(使__super__构造函数的属性未定义)的情况下,此方法似乎仍然有效。
Scott Weaver

1
比使用更好的__super__有下划线暗示的私有成员
马塞尔Falliere


5

我想是

MyModel = BaseModel.extend({
    initialize: function() {
        this.constructor.__super__.initialize.call(this);
        // Continue doing specific stuff for this child-class.
    },
});

这是this.__super__.initialize.call(this);
Raynos

双方this.__super__.prototype.initialize.call(this);this.__super__.initialize.call(this);抛出this.__super__ is undefined在Firebug。
工业

试试this.constructor .__ super __。initialize.call(this);
wheresrhys 2012年

2
我想将参数传递给initialize函数,这是唯一对我有用的版本this.constructor .__ super __。initialize.call(this,arguments);。
哈立德·达比扬

FWIW杰里米阿什克纳斯状态__super__不适合直接使用。
MikeSchinkel


2

与@wheresrhys类似,但是在BaseModel.initialize需要参数的情况下,我将使用apply而不是调用。我尝试避免处理可在初始化时传递给Backbone模型的属性映射,但是如果BaseModel实际上是View或Collection,则可能要设置选项。

var MyModel = BaseModel.extend({
    initialize: function() {
        this.constructor.__super__.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});

FWIW杰里米阿什克纳斯状态__super__不适合直接使用。
MikeSchinkel

0

这是一个多代callSuper方法,只需将其添加到扩展类中即可。

callSuper: function (methodName) {
    var previousSuperPrototype, fn, ret;

    if (this.currentSuperPrototype) {
        previousSuperPrototype = this.currentSuperPrototype;
        // Up we go
        this.currentSuperPrototype = this.currentSuperPrototype.constructor.__super__;
    } else {
        // First level, just to to the parent
        this.currentSuperPrototype = this.constructor.__super__;
        previousSuperPrototype = null;
    }

    fn = this.currentSuperPrototype[methodName];

    ret = (arguments.length > 1) ? fn.apply(this, Array.prototype.slice.call(arguments, 1)) : fn.call(this);

    this.currentSuperPrototype = previousSuperPrototype;

    return ret;
}

-4

您可以考虑使用函数继承来重写代码。

var BackBone=function(){
    var that={};

    that.m1=function(){

   };
   return that;

};

var MyModel=function(){

 var that=BackBone();
 var original_m1=that.m1;

//overriding of m1
 that.m1=function(){
    //call original m1
 original_m1();
 //custom code for m1
  };
};

我怀疑重写主干在这里是正确的:)我们必须使用结构主干给我们提供的结构来进行管理,而且比重写所有这些要好得多的解决方案,就像超级已经足够了。
桑德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.