14

在 Douglas Crockford 的书“Javascript: The Good Parts”中,他在将值传递给新对象时提到了对象说明符。本质上,他建议传递一个包含参数的对象,而不是按特定顺序将参数传递给函数,如下所示:

var myObject = someFunction({a: 1, b: 2, c: 3});

然而,没有解释的是如何在这些参数通过后处理这些参数。而不是执行以下操作来设置默认值:

function someFunction(params){
    this.a = params.a || 0; 
    this.b = params.b || 0;
    ...
}

处理大量参数而又不那么冗长的另一种方法是什么?


编辑:看看下面的答案,使用 for-in 循环是一个不错的选择。在为每个属性设置不同的默认值时,还有什么方法可以做到这一点?有没有办法创建一个具有各种默认值的对象并与之进行比较?

4

4 回答 4

9

通常它是使用一个defaults对象来完成的,如果参数中不存在属性,您可以从中复制属性。该对象可能是私有的或可供公众使用以进行配置。

var defaults = { a:null, b:1, ...};
function someFunction(params) {
    for (var prop in defaults)
        if (prop in params)
            this[prop] = params[prop];
        else
            this[prop] = defaults[prop];
}

或者

function someFunction(custom) {
    var params = { a:null, b:1, ...};
    for (var prop in custom)
        params[prop] = custom[prop];
    // now use params
}

有时custom/params,传递给函数的对象本身也会被扩展,但是在文档中应该明确提到该对象可以被修改:

var defaults = { a:null, b:1, ...};
function someFunction(params) {
    // modifies params object!
    for (var prop in defaults)
        if (! (prop in params))
            params[prop] = defaults[prop];
    // now use params
}

如果您正在使用带有extend函数的库,则通常可以将此初始化缩短为

    var params = $.extend({}, defaults, custom);
    // create an empty object, copy the defaults, and overwrite with custom properties
于 2012-11-12T23:27:11.290 回答
4

如何使用for-in循环

function someFunction(params){

    for(var key in params){
       if( params.hasOwnProperty(key){
           var def = null;
           if(key == 'a' || key == 'b'){
              def = 10;
           }
           if(key == 'c' || key == 'd'){
              def = undefined;
           }
           this[key] = params[key]  || def ;
       }
    }
}
于 2012-11-12T09:42:10.327 回答
1

循环遍历作为参数传递的对象中的字段,将每个字段创建为 this 对象上的字段。

function someFunction(params){
   for(x in params){
     this[x] = params[x];
   }
}

工作示例:http: //jsfiddle.net/59kzD/

于 2012-11-12T09:41:43.730 回答
0

Bergi的扩展答案: var params = $.extend({}, defaults, custom);

我们现在可以Object.assign({}, defaults, custom)在没有任何库的情况下在 ES6 中使用。

于 2018-01-31T01:35:14.607 回答