2013-01-16 111 views
0

我正在審查應用程序的代碼。我翻閱了我無法全面理解的以下代碼。Backbone.js中的共享方法和屬性?

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

您是否熟悉JavaScript中的'prototype'? – Lukas

回答

2

第一個代碼塊定義了一個構造函數,每次你調用一個視圖時都會調用它。在此功能,您可以用語法創建公共屬性:

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 

骨幹還支持更清晰地通過在類定義設置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' 
}); 
+0

非常感謝您的詳細回答,幫助我理解。 – touseefkhan4pk