1. ホーム
  2. javascript

[解決済み] なぜネイティブオブジェクトの拡張は悪い習慣なのか?

2022-04-28 20:12:38

質問

JSのオピニオンリーダーは皆、ネイティブオブジェクトを拡張することは悪い行為だと言っています。しかし、なぜでしょうか?パフォーマンスが低下するのでしょうか?誰かが間違った方法で、列挙可能な型を Object オブジェクトに対するすべてのループを実質的に破壊してしまうのでは?

取る TJホロウェイチュック 's should.js を例にとると 彼は はシンプルなゲッターを追加しています。 Object で、すべてうまくいきます ( ソース ).

Object.defineProperty(Object.prototype, 'should', {
  set: function(){},
  get: function(){
    return new Assertion(Object(this).valueOf());
  },
  configurable: true
});

これは本当に理にかなっている。例えば Array .

Array.defineProperty(Array.prototype, "remove", {
  set: function(){},
  get: function(){
    return removeArrayElement.bind(this);
  }
});
var arr = [0, 1, 2, 3, 4];
arr.remove(3);

ネイティブ型の拡張に反対する議論はあるのでしょうか?

どのように解決するのですか?

オブジェクトを拡張すると、その挙動が変化します。

自分のコードだけが使うオブジェクトの振る舞いを変えるのは問題ありません。しかし、他のコードでも使われるものの振る舞いを変更すると、その他のコードを壊してしまう危険性があります。

javascriptのオブジェクトクラスや配列クラスにメソッドを追加する場合、javascriptの仕組み上、何かを壊してしまうリスクが非常に高くなります。長年の経験から、この種のものはjavascriptにあらゆる種類のひどいバグを引き起こすことが分かっています。

カスタム動作が必要な場合は、ネイティブのものを変更するのではなく、独自のクラス(おそらくサブクラス)を定義する方がはるかによいでしょう。そうすれば、何も壊さずに済みます。

サブクラス化せずにクラスの動作を変更する機能は、優れたプログラミング言語にとって重要な機能ですが、めったに使わず、慎重に使用しなければならない機能です。