0

私のバックボーン アプリケーションには、静的プロパティを持つ親クラスと 2 つのサブクラスがあります。子クラスから親の静的プロパティを変更しようとしていますが、うまくいかないようです。サンプルコードは次のとおりです。

var ParentView = Backbone.View.extend({}, {
  staticProperty: 1,
  getStaticProperty: function() {
    return this.staticProperty;
  },
  setStaticProperty: function(value) {
    this.staticProperty = value;
  }
});

console.log('ParentView.staticProperty: ' + ParentView.getStaticProperty());
ParentView.setStaticProperty(2);

var ChildView1 = ParentView.extend({
  initialize: function() {
    console.log('ChildView1.staticProperty: ' + ChildView1.getStaticProperty());
    ChildView1.setStaticProperty(3);  // THIS SEEMS TO DO NOTHING
  }
});

var ChildView2 = ParentView.extend({
  initialize: function() {
    console.log('ChildView2.staticProperty: ' + ChildView2.getStaticProperty());
  }
});


var testView1 = new ChildView1();
var testView2 = new ChildView2();

ここに jsfiddle があります: http://jsfiddle.net/2agTW/1/

次の出力が期待されます。

ParentView.staticProperty: 1
ChildView1.staticProperty: 2
ChildView2.staticProperty: 3

しかし、代わりに、私は得る:

ParentView.staticProperty: 1
ChildView1.staticProperty: 2
ChildView2.staticProperty: 2  // I THINK THIS SHOULD BE 3

理由はありますか?

4

1 に答える 1

1

代わりに「ParentView」を使用する必要があります。

var ParentView = Backbone.View.extend({}, {
  staticProperty: 1,
  getStaticProperty: function() {
    return ParentView.staticProperty;
  },
  setStaticProperty: function(value) {
    ParentView.staticProperty = value;
  }
});

Backbone の継承モデルは少しガックリしているかもしれません (専門用語)。または少なくとも、古典的な意味での継承は行いません。いわゆる「静的」プロパティの場合、extend 関数はすべてのプロパティ (インスタンスと静的) を子にコピーすることになるため、ChildView1それぞれChildView2に独自の のコピーがありstaticPropertyます。を呼び出すsetStaticPropertyと、のコンテキストChildView1で動作し、関数のコピー内の演算子が を指すようになります。ChildView1thisChildView1.staticProperty

チュートリアル自体が間違っているとは言いませんthis。継承を使用していない場合は機能しますが、間違いなく誤解を招きます (著者が CoffeeScript を使用しているため、この特定の問題が隠されているのではないかと思います)。すべてのインスタンスが同じプロパティを参照するようにしたい場合は、常に基本クラスを参照し、thisプロパティを避けます。

この記事は、Backbone の継承の癖を理解するのに役立ちました。一読の価値があります。http://www.erichynds.com/blog/backbone-and-inheritance

于 2013-09-12T18:41:38.370 に答える