0

我的 Backbone 应用程序有一个带有静态属性的父类,以及两个子类。我正在尝试从子类修改父类的静态属性,但这似乎不起作用。这是一些示例代码:

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. 当您调用setStaticPropertyChildView1,它会在ChildView1的上下文中运行,从而使this函数副本中的运算符指向ChildView1.staticProperty

我不会说本教程本身是错误的 -this如果您不使用继承,它会起作用,但这肯定会产生误导(我怀疑作者对 CoffeeScript 的使用对他隐藏了这个特殊问题)。如果您希望所有实例都引用相同的属性,我将始终引用基类并避免使用该this属性。

这篇文章帮助我理解了 Backbone 的继承怪癖——它绝对值得一读。http://www.erichynds.com/blog/backbone-and-inheritance

于 2013-09-12T18:41:38.370 回答