• JavaScript-эквивалентом для заявленного способа продлить в jQuery

    Возможные Дубликаты:
    Как я могу объединить свойства двух динамически JavaScript-объектов?

    Фон

    У меня есть функция, которая принимает config объект в качестве аргумента. Внутри функции, я также default объект. Каждый из этих объектов содержит свойства, которые по существу работают как настройки для остальной код внутри функции. Для того, чтобы предотвратить того, чтобы указать все параметры внутри config объект, я использую jQuery с extend способ заполнить новый объект, settings с любыми значениями по умолчанию из default объекта, если они не были определены в config объект:

    var config = {key1: value1}; var default = {key1: default1, key2: default2, key 3: default 3};  var settings = $.extend(default, config);  //resulting properties of settings: settings = {key1: value1, key2: default2, key 3: default 3}; 

    Проблема

    Это прекрасно работает, но я бы хотел, чтобы воспроизвести эту функциональность без необходимости для jQuery. Есть не менее элегантный (или близко к) означает, что для этого с равнина ол' в JavaScript?


    Правка: Не Дублировать Обоснование

    Этот вопрос не дубликат "как я могу объединить свойства двух JavaScript-объекты динамически?" вопрос. Принимая во внимание, что вопрос просто хочет создать объект, который содержит все ключи и значения из двух отдельных объектов - я специально хочу обратиться, как это сделать в случае, если оба объекта разделяют некоторые, но не все ключи и какой объект получит приоритет (по умолчанию) на полученный объект в том случае, если имеются дубликаты ключей. И даже более конкретно, я хотел бы обратиться к использованию способ в jQuery, чтобы добиться этого и найти альтернативный способ, чтобы сделать это без jQuery. Хотя многие ответы на оба вопроса дублируют друг друга, что не означает, что сами вопросы те же.

  • Ответы

  • Чтобы получить результат в ваш код, вы могли бы сделать:

    function extend(a, b){     for(var key in b)         if(b.hasOwnProperty(key))             a[key] = b[key];     return a; } 

    Имейте в виду, что, как вы использовали продлить там будет изменять объект по умолчанию. Если Вы не хотите этого, используйте

    $.extend({}, default, config) 

    Более надежное решение, которое имитирует функциональность в jQuery будет выглядеть следующим образом:

    function extend(){     for(var i=1; i<arguments.length; i++)         for(var key in arguments[i])             if(arguments[i].hasOwnProperty(key))                 arguments[0][key] = arguments[i][key];     return arguments[0]; } 

    Можно перебрать свойства объекта, используя "по инструкции".

    var settings = extend(default, config);  function extend(a, b){     var c = {};     for(var p in a)    c[p] = (b[p] == null) ? a[p] : b[p];     return c; }