javascript中options对象的默认值

时间:2012-08-07 04:18:45

标签: javascript dojo

是否有更好的写作方式?我正在使用Dojo。也许混合会起作用吗?

  ajaxValidate: function(value, options){

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

似乎没有||=运算符,这看起来非常详细...

2 个答案:

答案 0 :(得分:2)

您展示的方法:

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

...是一个非常常见的习语,但我个人觉得if语句更具描述性,即使它实际上添加了几个字符:

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

如果你想要一个更通用的方法,你可以写一个类似下面的函数(我不熟悉Dojo - 也许它已经有了这样的函数):

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”。

答案 1 :(得分: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);

    //...
}