Backbone.js中的共享方法和属性?

时间:2013-01-16 15:09:54

标签: jquery backbone.js requirejs

我正在审核应用程序的代码。我浏览了以下全面无法理解的代码。

 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在他们的子实例之间共享?

1 个答案:

答案 0 :(得分:2)

第一个代码块定义了一个构造函数,每次new向上查看时都会调用该函数。在该函数中,您可以使用以下语法创建公共属性:

this.foo = "bar";

每次初始化视图时,都会运行此初始化代码,并将属性附加到视图的实例。不共享实例属性。

第二个代码块扩展构造函数的原型,首先使用Backbone.View的所有属性,然后使用块中定义的属性。如果您愿意,可以在函数的所有实例或“类”之间共享原型属性。

该代码基本上做的是创建一个新函数,然后使用Backbone.View的属性对其进行增强。因为永远不会调用Backbone.View自己的构造函数(至少在你发布的代码中),这意味着这个类不会像普通的Backbone View那样工作。例如,传递给构造函数的modelid属性不会像通常那样自动复制到实例:

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'
});