我有一个基本视图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
,我该怎么做?在此示例中,我试图了解此继承系统
q
和z
类似于将在以下位置定义的虚拟/抽象值子类。
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的实际情况,因此我们必须注意不要过于重视术语。