超级骨干

And*_*rle 74 javascript inheritance backbone.js

当我覆盖a的clone()方法时Backbone.Model,有没有办法从我的植入中调用这个overriden方法?像这样的东西:

var MyModel = Backbone.Model.extend({
    clone: function(){
        super.clone();//calling the original clone method
    }
})
Run Code Online (Sandbox Code Playgroud)

sol*_*oth 100

你会想要使用:

Backbone.Model.prototype.clone.call(this);
Run Code Online (Sandbox Code Playgroud)

这将使用(当前模型)的上下文调用原始clone()方法.Backbone.Modelthis

来自Backbone文档:

简要介绍一下super:JavaScript没有提供一种调用super的简单方法 - 在原型链上定义的同名函数更高.如果覆盖像set或save这样的核心函数,并且想要调用父对象的实现,则必须显式调用它.

var Note = Backbone.Model.extend({
 set: function(attributes, options) {
 Backbone.Model.prototype.set.apply(this, arguments);
 ...
 }    
});
Run Code Online (Sandbox Code Playgroud)

  • @MikaelLepistö看到问题http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply (5认同)

cha*_*sto 36

您还可以使用__super__属性作为父类原型的引用:

var MyModel = Backbone.Model.extend({
  clone: function(){
    MyModel.__super__.clone.call(this);
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 关于这个答案的一点背景:`__super__`是对父骨原型的引用,Backbone框架在每次扩展Backbone模型,集合,路由器或视图时都会这样做.虽然它不是标准属性,但它自框架生成以来确实可以跨浏览器工作.然而,即使Backbone官方文档也没有提到这一点,并说使用`Backbone.Model.prototype.set.call(this,attributes,options);`方法.但两者似乎都很好. (22认同)
  • 你也可以使用:this.constructor .__ super__ (2认同)

Dav*_*der 18

Josh Nielsen 为此找到了一个优雅的解决方案,它隐藏了很多丑陋.

只需将此代码段添加到您的应用中即可扩展Backbone的模型:

Backbone.Model.prototype._super = function(funcName){
    return this.constructor.prototype[funcName].apply(this, _.rest(arguments));
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

Model = Backbone.model.extend({
    set: function(arg){
        // your code here

        // call the super class function
        this._super('set', arg);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于只有一个级别的实现A.foo - > B.foo,在A.foo的情况下 - > B.foo - > C.foo你将得到一个堆栈溢出,因为B这引用自身 (5认同)