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}