LoginSignup
17
17

More than 5 years have passed since last update.

prototype汚染しないようにObject.prototypeを拡張する

Last updated at Posted at 2013-08-02

Object.prototype.hoge = function(){…}などとやってしまうと、for inhogeが列挙されてしまう。
昔はこれを回避する方法がなかったので禁忌とされていたが、もはや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を使うとうまくいった。
mergefor inで列挙されないので、ちゃんと動く。

({hoge: 1}).merge({fuga: 2}) //=> {hoge: 1, fuga: 2}
17
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17