7

我有一个三个 Backbone View 类继承:

var preventRecursion = 0;

var parentView = Backbone.View.extend({

  initialize: function(){
    console.log('parentView');
  }
});

var nestedChildView = parentView.extend({

  initialize: function(){

    if (++preventRecursion == 5) {throw "Recursion"};

    console.log('nestedChildView');
    this.constructor.__super__.initialize.apply(this);          
  }
});

var nestedNestedChildView = nestedChildView.extend({

  initialize: function(){
    console.log('nestedNestedChildView');
    this.constructor.__super__.initialize.apply(this);          
  }
});

当我尝试创建nestedNestedChildView 时:

var t = new nestedNestedChildView();

我得到无限递归:这里是jsfiddle

4

1 回答 1

14

Model.extend文档中所述,

关于 super 的简要说明:JavaScript 没有提供调用 super 的简单方法——在原型链上定义的同名函数。如果你重写了一个像 set 或 save 这样的核心函数,并且你想调用父对象的实现,你必须显式地调用它,如下所示:

在你的类层次结构中,this.constructor总是等于的构造函数nestedNestedChildView,这意味着this.constructor.__super__.initialize将是nestedChildView.initialize一个循环。请参阅http://jsfiddle.net/X5yBb/进行测试。

您可以显式调用类 __super__ ( http://jsfiddle.net/X5yBb/1/ )

var nestedChildView = parentView.extend({
  initialize: function(){
    console.log('nestedChildView');
    nestedChildView.__super__.initialize.apply(this);          
  }
});

var nestedNestedChildView = nestedChildView.extend({
  initialize: function(){
    console.log('nestedNestedChildView');
    nestedNestedChildView.__super__.initialize.apply(this);          
  }
});

或者如果您愿意,也可以调用原型链上的方法(http://jsfiddle.net/X5yBb/2/):

var nestedChildView = parentView.extend({
  initialize: function(){
    console.log('nestedChildView');
    parentView.prototype.initialize.apply(this);          
  }
});

var nestedNestedChildView = nestedChildView.extend({
  initialize: function(){
    console.log('nestedNestedChildView');
    nestedChildView.prototype.initialize.apply(this);          
  }
});

有关该主题的更多信息,请参阅Accessing parent class in BackboneSuper in Backbone

于 2013-04-13T12:57:24.807 回答