決して列挙可能なプロパティを Object.prototype に追加しないでください
コードが Object 型のプロパティを反復処理するために for..in ループに依存している場合は、Object.prototype の列挙可能なプロパティを追加しないでください。
しかし、JavaScript 実行環境を強化する場合、Object.prototype オブジェクトに新しいプロパティやメソッドを追加することが必要になることがよくあります。たとえば、オブジェクト内のすべてのプロパティ名を取得するメソッドを追加できます:
Object.prototype.allKeys = function() { var result = []; for (var key in this) { result.push(key); } return result; };
しかし、結果は次のようになります:
({ a: 1, b: 2, c: 3}).allKeys(); // ["allKeys", "a", "b","c"]
実現可能な解決策は、Object Define new の代わりに関数を使用することです。 .prototype のメソッド:
function allKeys(obj) { var result = []; for (var key in obj) { result.push(key); } return result; }
ただし、本当に Object.prototype に新しいプロパティを追加する必要があり、そのプロパティを for..in ループ内で走査したくない場合は、ES5 Object.defineProject メソッドを使用できます。環境によって提供されます:
Object.defineProperty(Object.prototype, "allKeys", { value: function() { var result = []; for (var key in this) { result.push(key); } return result; }, writable: true, enumerable: false, configurable: true });
上記のコードの重要な部分は、enumerable 属性を false に設定することです。この場合、プロパティを for..in ループ内で走査することはできません。
以上がどのような状況では、JavaScript は Object.prototype に列挙可能なプロパティを追加すべきではありませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。