Javascript中的对象说明符

ope*_*pes 14 javascript function object

在道格拉斯·克罗克福德(Douglas Crockford)的书"Javascript:The Good Parts"中,他提到了将值传递给一个新对象的对象说明符.本质上,他建议不要以特定的顺序将参数传递给函数,而是建议传递一个包含在其中的参数的对象,如下所示:

var myObject = someFunction({a: 1, b: 2, c: 3});
Run Code Online (Sandbox Code Playgroud)

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

function someFunction(params){
    this.a = params.a || 0; 
    this.b = params.b || 0;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


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

Ber*_*rgi 8

通常使用一个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];
}
Run Code Online (Sandbox Code Playgroud)

要么

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

有时候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
}
Run Code Online (Sandbox Code Playgroud)

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

    var params = $.extend({}, defaults, custom);
    // create an empty object, copy the defaults, and overwrite with custom properties
Run Code Online (Sandbox Code Playgroud)