1

我想要一個乾淨的方式來實例化和更新JavaScript對象。
現在,我使用這種方法:乾淨的方式來實例化和更新JavaScript對象? (我的方法是否有效?)

myApp.chart.GridController = Backbone.Base.extend({ 

    _defaults : { 

     width : 500, 
     height : 500, 
     indicatorXMin : 100, 
     indicatorXMax : 10000, 
     indicatorXScale : "log", 

     xScale : undefined, 
     yScale : undefined, 

     xAxis : undefined, 
     yAxis : undefined, 

     element : undefined, 

    }, 

    options : {}, 

    constructor: function (options) { 
     this.options = $.extend(this.options.defaults, options); 
     this.render(); 
    }, 

    update : function(options) { 
     this.options = $.extend(this.options, options); 
     this.render(); 
    }, 

    render : function(){ 
     this.updateAxes(); 
     this.draw(); 
    } 

[...] 
  1. 是否有設置和壓倒一切的默認值的更好的方法?

  2. 使用此方法時,我總是要使用「選項」前綴我的所有的變量,有一個更清潔的解決方法嗎?

  3. 在上述例子中,_defaults.xAxis和_defaults.yAxis實際上從其它變量的。無論如何,這些應該放入_defaults對象中,還是放置在哪裏? (我不希望有跟蹤哪些變量「導出選項」,而不是...)


3)編輯: 我的意思是不應該的對象屬性在構造函數中被覆蓋,而是根據其他屬性進行更新。

不使用$ .extend我做類似:

var a,b; var c;

構造(A,B) this.a = A; this.b = b;

this.c = A + B;

我只是想知道,如果它是有問題的把c中的默認設置中...

+0

我不知道我的理解(3)以上 - 也許如果添加的是什麼,你認爲你可以做的,而不是你上面貼的代碼的例子。 – Pointy

+0

@Pointy:我添加了一個簡單的例子。Thx:=) – dani

+0

好吧,我現在看到 - 我會添加到我的答案。 – Pointy

回答

0

這種做法都將有一個問題,因爲「$ .extend()」 覆蓋的第一個參數內容。對於「默認」,那將是壞:-)

this.options = $.extend({}, this._defaults, options); 

這是避免該問題以正常的方式:通過在一個全新的空對象作爲第一個參數,然後那將是第一填充與所有的默認值,然後與任何傳入來覆蓋這些。

有沒有真正的好方式「繞過」有通過「選項」句柄引用變量。您可以使本地副本,而在局部意義上的無害它可以引入錯誤。現在

編輯 — OK,我看到你的意思(3),我認爲我會做的是計算這些屬性後,你已經擴展了默認的東西。這樣,即使客戶端代碼傳入了一些實際上不應該存在的內容,您也會用合法的值覆蓋它。

所以,像這樣:

this.options = $.extend({}, this._defaults, options); 
    this.options.something = someFunction(); 
    this.options.somethingElse = whatever(); 
相關問題