2012-08-07 108 views
1

有沒有(很多)更好的書寫方式?我正在使用Dojo。也許混合會工作?JavaScript中選項對象的默認值

ajaxValidate: function(value, options){ 

    // Set some defaults 
    options.ajaxInvalidMessage = options.ajaxInvalidMessage || "Value not allowed"; 
    options.ajaxStore = options.ajaxStore || null; 
    options.ajaxFilterField = options.ajaxFilterField || 'name'; 

似乎沒有成爲一個||=運營商,這看起來非常詳細,我...

回答

1

使用mixin是一種更清潔的方法。這樣,您也可以將默認值顯式分組爲單個對象。

http://dojotoolkit.org/reference-guide/1.7/dojo/mixin.html

ajaxValidate: function (value, options) { 
    options = dojo.mixin({ 
     ajaxInvalidMessage: "Value not allowed", 
     ajaxStore: null, 
     ajaxFilterField: "name" 
    }, options); 

    //... 
} 
2

告訴你的方法:

obj.prop = obj.prop || "default"; 

...是一個很常見成語,但我個人發現if語句更具描述性,即使它實際上添加了幾個字符:

if (!obj.prop) obj.prop = "default"; 

如果你想這樣做更廣泛的方式,你可以編寫一個函數類似如下(我不熟悉的道場 - 也許它已經有這樣的功能):

function addDefaults(obj, defaults) { 
    for (prop in defaults) 
     if (!obj.hasOwnProperty(prop)) 
      obj[prop] = defaults[prop]; 
} 

,你會再在您的代碼段使用如:

ajaxValidate: function(value, options){ 

    addDefaults(options, { 
     ajaxInvalidMessage : "Value not allowed", 
     ajaxStore : null, 
     ajaxFilterField : 'name' 
    }); 

注意,在我的addDefaults()我用它測試你的對象中是否存在屬性的hasOwnProperty() method。這與您開始使用||語法的細微差別在於哪些測試屬性是否爲「truthy」。