3

对于很多 jQuery 函数,您可以将选项对象传递给函数。在内部,它覆盖了函数的默认选项。我想你可以通过以下方式做到这一点

function myFunc (userOptions) {
    userOptions = userOptions || {};

    var defaultOptions = {
        'myOption': true;
    };

    var options = {
        'myOption': userOptions.hasOwnProperty('myOption') ? userOptions.myOptions : defaultOptions.myOption;
    };

    ...

    if (options.myOption) {
        //do stuff
    }
}

虽然这真的很乏味,而且似乎很容易出错,尤其是维护。所以我的问题是最简单、最安全的方法是什么?

4

4 回答 4

6

明确并不是一个坏主意,因为它可以保持控制和清晰。但是,您可以执行以下操作:

var actualOptions = defaultOptions;
for(var property in userOptions) {
    if(userOptions.hasOwnProperty(property)) {
        actualOptions[property] = userOptions[property];
    }
}

请注意,我说的是“类似”。上面其实有个小瑕疵,就是会覆盖defaultOptions对象。我会留给你来避免这种情况发生,循环是这里的核心思想。或者,如果您更喜欢 ECMAScript 5

var actualOptions = defaultOptions,
    keys = Object.keys(userOptions);
for(var i = 0; i < keys.length; i++) {
    actualOptions[keys[i]] = userOptions[keys[i]];
}

由于您已经在使用 jQuery,因此您可以在这里利用 jQuery 的功能,正如 Andreas 在评论中指出的那样,使用

var actualOptions = $.extend({}, defaultOptions, userOptions);
于 2013-09-26T17:47:11.573 回答
0

在 jQuery 中,我通常将此模式视为一种快捷方式,如下所示:

function myFunc(userOptions) {
    userOptions = userOptions || {};

    var defaultOptions = {
            'opt1': true,
            'opt2': false
        },

        // Preserve defaultOptions object, and deep copy userOptions
        options = $.extend(true, {}, defaultOptions, userOptions);

    // do stuff
}
于 2013-09-26T17:56:10.413 回答
0

jquery 在内部使用.extend( http://api.jquery.com/jQuery.extend/ ) 方法用用户属性覆盖默认值。

在您的情况下,您必须手动对所有属性执行此操作,而不是简单地使用属性循环并检查它们是否存在于用户选项中,然后将其分配给您的内部选项。

就像是

var options = {myOpt1:1, myOpt2:2};
var userOptions = {myOpt1:3};

for(var p in options){
    if(userOptions.hasOwnProperty(p)){
        options[p] = userOptions[p];
    }
}

console.log(options);

或者简单地使用 jquery extend 它做同样的事情并且安全地做,因为上面的循环不是真正安全的代码。

于 2013-09-26T17:49:33.657 回答
-1

Jquery 有一个“扩展”方法可以做你想做的事: Jquery extend api reference。它本质上为您循环遍历属性。

如果你不想使用查询,或者编写自己的代码,你可以使用underscore.js。按照 Ingo Burk 的建议编写自己的循环并不是一个坏主意。

于 2013-09-26T17:51:11.333 回答