Object.prototype.hoge = function(){…}などとやってしまうと、for inにhogeが列挙されてしまう。
昔はこれを回避する方法がなかったので禁忌とされていたが、もはやObject.definePropertyが普通に使える今、拡張してはいけない理由はないはず。
ありました。alucky0707さんの記事に詳しいですが、Object.prototypeを拡張してしまうとグローバル変数を定義するのと同義ですので、やるなら明確な意思をもって、自己責任でお願いします。
よって下記のコードは好ましくないです。
(ただ、Object以外のprototypeを拡張する場合はこの限りではないので、下記のパターンを用いてObject以外のprototypeにメソッドを生やすこと自体は問題ないはず)
Object.defineProperty(Object.prototype, 'merge', {
value: function(o){
for(var key in o){
this[key] = o[key];
}
return this;
},
writable: true,
configurable: true,
enumerable: false
});
definePropertyでプロパティにメソッドを生やしたい場合、valueを使うとうまくいった。
mergeがfor inで列挙されないので、ちゃんと動く。
({hoge: 1}).merge({fuga: 2}) //=> {hoge: 1, fuga: 2}