[解決済み] なぜネイティブオブジェクトの拡張は悪い習慣なのか?
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にあらゆる種類のひどいバグを引き起こすことが分かっています。
カスタム動作が必要な場合は、ネイティブのものを変更するのではなく、独自のクラス(おそらくサブクラス)を定義する方がはるかによいでしょう。そうすれば、何も壊さずに済みます。
サブクラス化せずにクラスの動作を変更する機能は、優れたプログラミング言語にとって重要な機能ですが、めったに使わず、慎重に使用しなければならない機能です。
関連
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] JavaScriptのオブジェクトの配列からidでオブジェクトを検索する
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
jsを使った簡単な照明スイッチのコード
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
vueにおけるfilterの適用シーンについて解説します。
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】TypeScript-のAngular Frameworkエラー - "exportAsがngFormに設定されたディレクティブはありません"
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?