我有一个基本视图V

V = Backbone.View.extend({
  initialize: function() {
    console.log(this.options.z);
    console.log(this.options.q);
  }
});


VV扩展,它设置属性(q: 234)的值:

VV = V.extend({q:234});


V进一步专门用于VV

new VV({z: 123})



问题是基本类型无法访问q,我该怎么做?
在此示例中,我试图了解此继承系统
qz类似于将在以下位置定义的虚拟/抽象值
子类。

http://jsfiddle.net/maxl/G8cab/

最佳答案

当你这样说:

VV = V.extend({q: 234});


您正在创建VV作为V的“子类”,它将具有额外的q属性。 “类”定义的属性与View#initialize中的自动选项处理无关。

如果文档说“创建视图的新实例”,则文档可能会更好。

然后,当您使用new VV({z: 123})时,该{z: 123}将通过其单个initialize参数(在1.1.0版之前的主干自动将options设置为构造函数的选项)传递给视图的this.options方法,该q将在this.q中,因此您的initialize应该看起来像这样:

initialize: function(options) {
  console.log(options.z);
  console.log(this.q);
}


另外,如果您这样做:

var VVV = VV.extend({q: 'pancakes'});


您将替换默认的q,其中VV get和this.q的实例将是'pancakes'内的initialize

演示:http://jsfiddle.net/ambiguous/eqBV2/

使用View#extend就像子类化(或更准确地说,它创建了一个新的原型实例),而new创建了新的对象(或原型实例的副本)。当然,类/实例语言不适合JavaScript的实际情况,因此我们必须注意不要过于重视术语。

09-25 16:10