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として登録することにした。