2013-04-13 1 views
7

У меня есть три Backbone View класса наследования в:Backbone Просмотр наследования - вызов родитель приводит к рекурсии

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

ответ

13

Как указано в документе о Model.extend,

Краткая информация о супер: JavaScript не предоставляет простой способ для вызова super - функция с тем же именем определена выше на прототипе цепь. Если переопределить основную функцию, как набор, или сохранить, и вы хотите ссылаться на реализации родительского объекта, вы должны будете явно назвать, по этим линиям:

В вашей иерархии классов, 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 Backbone и Super in Backbone для получения дополнительной информации на предмет.

+0

Благодарим вас за ответ. – Erik