JS のオピニオン リーダーは皆、ネイティブ オブジェクトを拡張するのは悪い習慣だと言います。しかし、なぜでしょうか。パフォーマンスが低下するのでしょうか。誰かが「間違った方法」で に列挙型を追加し、Object
実質的にすべてのオブジェクトのループを破壊してしまうのではないかと恐れているのでしょうか。
取るTJ ホロウェイチュクのすべき.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);
ネイティブ型を拡張することに反対する意見はありますか?
ベストアンサー1
オブジェクトを拡張すると、その動作が変更されます。
自分のコードでのみ使用されるオブジェクトの動作を変更することは問題ありません。ただし、他のコードでも使用されるオブジェクトの動作を変更すると、他のコードが壊れるリスクがあります。
JavaScript のオブジェクト クラスと配列クラスにメソッドが追加されると、JavaScript の動作の仕組み上、何かが壊れるリスクが非常に高くなります。長年の経験から、このようなことが JavaScript であらゆる種類のひどいバグを引き起こすことがわかりました。
カスタム動作が必要な場合は、ネイティブクラスを変更するのではなく、独自のクラス (おそらくサブクラス) を定義する方がはるかに適切です。 そうすれば、何も壊れることはありません。
サブクラス化せずにクラスの動作を変更する機能は、優れたプログラミング言語の重要な機能ですが、まれにしか使用せず、注意して使用する必要があります。