0

我正在审查应用程序的代码。我遇到了以下我无法全面理解的代码。

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

4

1 回答 1

2

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

this.foo = "bar";

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

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

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

var view = new av.Application.BaseView({model:model});
console.log(view.model); //-> undefined

constructorBackbone 还支持通过在类定义中设置属性来更干净地覆盖构造函数:

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'
});
于 2013-01-16T15:32:52.707 回答