我正在审核应用程序的代码。我浏览了以下全面无法理解的代码。
define(['av'], function (av) {
av.Application.BaseView = function (options) {
//add non-shared methods/properties here --------------------- 1)
};
_.extend(av.Application.BaseView.prototype, Backbone.View.prototype, {
// add shared methods/properties here ------------------------ 2)
});
av.Application.BaseView.extend = Backbone.View.extend;
});
任何人为什么在评论1之后添加的方法/属性是非共享的,并且在评论之后没有2在他们的子实例之间共享?
答案 0 :(得分:2)
第一个代码块定义了一个构造函数,每次new
向上查看时都会调用该函数。在该函数中,您可以使用以下语法创建公共属性:
this.foo = "bar";
每次初始化视图时,都会运行此初始化代码,并将属性附加到视图的实例。不共享实例属性。
第二个代码块扩展构造函数的原型,首先使用Backbone.View
的所有属性,然后使用块中定义的属性。如果您愿意,可以在函数的所有实例或“类”之间共享原型属性。
该代码基本上做的是创建一个新函数,然后使用Backbone.View
的属性对其进行增强。因为永远不会调用Backbone.View
自己的构造函数(至少在你发布的代码中),这意味着这个类不会像普通的Backbone View那样工作。例如,传递给构造函数的model
或id
属性不会像通常那样自动复制到实例:
var view = new av.Application.BaseView({model:model});
console.log(view.model); //-> undefined
Backbone还支持通过在类定义中设置constructor
属性来更干净地覆盖构造函数:
av.Application.BaseView = Backbone.View.extend({
//override the constructor function
constructor: function(options) {
//this property is not shared between instances
this.foo = 'bar';
//call Backbone's own constructor, so we get all the default behavior
Backbone.View.prototype.constructor.apply(this, arguments);
},
//this property is attached to the prototype, and is shared
baz: 'qux'
});