7

3 つの 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を意味します。テストについては、http://jsfiddle.net/X5yBb/を参照してください。this.constructor.__super__.initializenestedChildView.initialize

クラス __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);          
  }
});

このテーマの詳細については、バックボーンの親クラスへのアクセスとバックボーンスーパーへのアクセスを参照してください。

于 2013-04-13T12:57:24.807 に答える