2013-04-13 11 views
7

Mam trzy Backbone Zobacz klasy dziedziczenie:Backbone Zobacz dziedziczenie - rozmowa z rodziców prowadzi do rekurencji

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);   
    } 
}); 

Kiedy próbuję tworzyć nestedNestedChildView:

var t = new nestedNestedChildView(); 

uzyskać nieskończoną rekurencję: Tutaj jsfiddle

Odpowiedz

13

Jak podano w dokumencie na temat Model.extend,

Krótko o sobie na super: JavaScript nie zapewnia prostego sposobu wywołania super - funkcja o tej samej nazwie zdefiniowana wyżej na łańcuchu prototypowym . Jeśli zastąpić funkcję rdzenia podobnego zestawu, lub zapisać i chcesz powołać realizację obiektu nadrzędnego, musisz jednoznacznie nazwać, wzdłuż tych linii:

w hierarchii klasowej, this.constructor zawsze jest równy konstruktorowi nestedNestedChildView, co oznacza, że ​​this.constructor.__super__.initialize będzie nestedChildView.initialize, a tym samym pętlę. Zobacz http://jsfiddle.net/X5yBb/ dla testu.

Można jawnie wywołać klasy __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);   
    } 
}); 

lub wywołać metody na łańcuchu prototypów, jeśli wolisz (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);   
    } 
}); 

Zobacz Accessing parent class in Backbone i Super in Backbone aby uzyskać więcej informacji w temacie.

+0

Dziękuję za odpowiedź. – Erik

Powiązane problemy