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

パラメータとして渡されたオブジェクトのフィールドをループし、このオブジェクトのフィールドとして各フィールドを作成します。

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

実例:http://jsfiddle.net/59kzD/

于 2012-11-12T09:41:43.730 に答える
0

ベルギによる回答の拡張: var params = $.extend({}, defaults, custom);

Object.assign({}, defaults, custom)これで、ライブラリなしでES6で使用できます。

于 2018-01-31T01:35:14.607 に答える