パフォーマンスも理由です。キーをループする必要がある場合があります。これを行うにはいくつかの方法があります
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
私は通常for of Object.keys()
、それが正しいことをし、比較的簡潔で、チェックを追加する必要がないので使用します。
しかし、それははるかに遅いです。

理由を推測するだけObject.keys
で遅いのは明らかでObject.keys()
、割り当てを行う必要があります。実際、AFAIKは、それ以降、すべてのキーのコピーを割り当てる必要があります。
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
JSエンジンが何らかの不変のキー構造を使用して、不変のObject.keys(object)
キーを反復処理し、まったく新しい不変のキーオブジェクトを作成する参照を返す可能性がありobject.newProp
ますが、それでも明らかに最大15倍遅くなります。
チェックでさえhasOwnProperty
最大2倍遅くなります。
そのすべてのポイントは、パフォーマンスに敏感なコードがあり、キーをループする必要がある場合は、for in
を呼び出さなくても使用できるようにする必要があるということですhasOwnProperty
。変更していない場合にのみこれを行うことができますObject.prototype
Object.defineProperty
追加するものが列挙できない場合にプロトタイプを変更するために使用する場合、上記の場合、JavaScriptの動作に影響を与えないことに注意してください。残念ながら、少なくともChrome 83では、パフォーマンスに影響します。

パフォーマンスの問題を強制的に表示するために、3000個の列挙不可能なプロパティを追加しました。30のプロパティしかないため、テストが近すぎて、パフォーマンスに影響があったかどうかを判断できませんでした。
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox77とSafari13.1は、拡張クラスと非拡張クラスのパフォーマンスに違いがないことを示しました。おそらくv8がこの領域で修正され、パフォーマンスの問題は無視できます。
しかし、私も付け加えておきますが、の話がありArray.prototype.smoosh
ます。短いバージョンは、人気のあるライブラリであるMootoolsで、独自に作成されていArray.prototype.flatten
ます。標準化委員会がネイティブを追加しようとしたとき、Array.prototype.flatten
彼らは多くのサイトを壊さずにはいられないことに気づきました。休憩について知った開発者は、es5メソッドsmoosh
をジョークと名付けることを提案しましたが、人々はそれがジョークであると理解せずにびっくりしました。flat
彼らは代わりに落ち着きましたflatten
話の教訓は、ネイティブオブジェクトを拡張するべきではないということです。そうした場合、同じ問題が発生する可能性があり、特定のライブラリがMooToolsと同じくらい人気がない限り、ブラウザベンダーはあなたが引き起こした問題を回避する可能性はほとんどありません。あなたの図書館がそれほど人気を博しているのなら、あなたが引き起こした問題を他の人たちに強制的に回避させるのは一種の意味があるでしょう。したがって、ネイティブオブジェクトを拡張しないでください