javascript getter setter を設定したObjectを extendsすると1回しか実行されない

extendを実行したときにgetter,setterの内容が、extend時点のプロパティとなってしまう。

jqueryの$.extendやlodashの_.extendsなどのjavascriptのライブラリのextendsメソッド、ネイティブなassignもgetterとsetterに対応していない。参考ページのようにそれぞれのライブラリを修正してgetter,setterに対応するしかない。

以下のように自分で作れとさ

var obj = {
  foo: 1,
  get bar() {
    return 2;
  }
};

var copy = Object.assign({}, obj); 
console.log(copy); 
// { foo: 1, bar: 2 },copy.barの値はobj.barのgetterの返り値の値です。

// アクセサをコピーする自作関数です。
function extend(target, ...sources) {
  sources.forEach(source => {
    Object.defineProperties(target, Object.keys(source).reduce((descriptors, key) => {
      descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
      return descriptors;
    }, {}));
  });
  return target;
}

var copy = extend({}, obj);
console.log(copy);
// { foo:1, get bar() { return 2 } }

結論、Object.prototype.extendとかすると影響がでかいので
グローバル空間にextend functionとして登録することにした。