2012-08-07 105 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”。