まくまくJavaScriptノート
2つのオブジェクトのプロパティをマージする
2015-02-11

extend 関数を実装する

下記の extend 関数は、第1引数で渡されたオブジェクトに、第2引数で渡されたオブジェクトのプロパティをすべてコピーします。 Prototype チェーンを辿ってプロパティをコピーしないようにするために、hasOwnProperty() を使い、第2引数で渡されたオブジェクト自身で定義されたプロパティのみをコピーしています。

// Extend the first object with all the properties in the second object.
function extend(obj1, obj2) {
  for (key in obj2) {
    if (obj2.hasOwnProperty(key)) {
      obj1[key] = obj2[key];
    }
  }
  return obj1;
}

// 使用例
var a = {'A':1};
var b = {'B':2, 'C':3};
extend(a, b);
console.log(a);  //=> {'A':1, 'B':2, 'C':3}

underscore.js の extend 関数

下記は、参考にした underscore.js の extend 関数の抜粋です。

// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
  if (!_.isObject(obj)) return obj;
  var source, prop;
  for (var i = 1, length = arguments.length; i < length; i++) {
    source = arguments[i];
    for (prop in source) {
      if (hasOwnProperty.call(source, prop)) {
        obj[prop] = source[prop];
      }
    }
  }
  return obj;
};

// 上記の hasOwnProperty は、Object.prototype.hasOwnProperty
2015-02-11