Javascript中的对象说明符

Javascript中的对象说明符,javascript,function,object,Javascript,Function,Object,在Douglas Crockford的书“Javascript:好的部分”中,他在向新对象传递值时提到了对象说明符。本质上,他建议传递包含参数的对象,而不是按特定顺序将参数传递给函数,如下所示: var myObject = someFunction({a: 1, b: 2, c: 3}); 但是,没有解释的是,在传递这些参数之后如何处理它们。不要执行以下操作来设置默认值: function someFunction(params){ this.a = params.a || 0;

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

var myObject = someFunction({a: 1, b: 2, c: 3});
但是,没有解释的是,在传递这些参数之后如何处理它们。不要执行以下操作来设置默认值:

function someFunction(params){
    this.a = params.a || 0; 
    this.b = params.b || 0;
    ...
}
还有什么方法可以处理大量参数而不至于太冗长



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

循环通过作为参数传递的对象中的字段,将每个字段创建为此对象上的字段

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

工作示例:

使用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 ;
       }
    }
}

通常使用
默认值
对象完成,如果参数中不存在属性,则可以从该对象复制属性。该对象可能是私有的,或可供公共配置

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];
}

有时传递到函数中的
自定义/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
扩展Bergi的答案:
var params=$.extend({},默认值,自定义)


现在,我们可以在ES6中使用
Object.assign({},默认值,自定义)
,而无需任何库。

您可以拥有一个“标准”对象,您可以在某种循环中将输入与之进行比较。jQuery插件通常处理这个问题的方式(尽管使用jQuery)可能也很有趣:请注意,逐个执行参数可以让您单独指定默认值(m90建议的默认对象也允许这样做),或者,如果没有提供某些参数,则采取特殊措施。m90&nnnnnn:如果您想举例说明答案,我已经更新了我的问题,以说明不同的默认值。注意;)不过有一点,我认为指出这只是一个肤浅的复制是恰当的。但这可能是我想要的。这是对我最初问题的一个很好的回答。如果您想编辑它以解释不同的默认值,我将非常感激。@sprawl。。不同的默认值是什么意思?此函数绝对不起作用。它枚举给定的
params
参数,但当您省略
a
b
时,
null
也不会被用作默认值。@Sushanth--您将其设置为null,如果您想根据默认值的对象将其设置为其他值,该怎么办?例如,你想要这个.a等于,比如说,如果没有任何输入,你想要这个.b等于7,或者类似的东西。对于我的问题,这绝对是最干净的解决方案。这正是我想要的。
    var params = $.extend({}, defaults, custom);
    // create an empty object, copy the defaults, and overwrite with custom properties