ホームページ >ウェブフロントエンド >jsチュートリアル >For-In ループを中断せずに配列およびオブジェクトのプロトタイプを安全に拡張するにはどうすればよいですか?

For-In ループを中断せずに配列およびオブジェクトのプロトタイプを安全に拡張するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-09 13:40:15664ブラウズ

How Can I Safely Extend Array and Object Prototypes Without Breaking For-In Loops?

For-In ループを乱雑にせずに配列とオブジェクトのプロトタイプを拡張する

ヘルパー メソッドを使用して Array.prototype と Object.prototype を拡張する場合、これらのメソッドが値として現れることで for-in ループに干渉しないようにすることが重要です。これは、他のコードが値へのアクセスのみに for-in ループに依存しているシナリオでは特に重要です。

配列を使用した For-In ループを避ける

理想的な解決策は次のとおりです。配列での for-in ループの使用は避けてください。代わりに、組み込みの .map() や .filter() などの配列固有の反復メソッドを使用してください。配列とオブジェクトの両方に遭遇する可能性があるジェネリック関数では for-in ループを避けてください。

オブジェクトで hasOwnProperty() を使用する

ジェネリックで for-in ループの使用が避けられない場合関数では、 hasOwnProperty() メソッドを使用して、関数から継承されたプロパティを除外します。プロトタイプ:

for (var prop in anyObj)
    if (Object.prototype.hasOwnProperty.call(anyObj, prop))
        // do something

ECMAScript 5.1 の列挙不可能なプロパティ

ECMAScript 5.1 では、Object.defineProperty() を使用してプロパティを列挙不可能に設定できます。

Object.defineProperty(Array.prototype, "find", {
    enumerable: false,
    writable: true,
    value: function(testFun) {
        // code to find element in array
    }
});

これにより、 "find" メソッドは for-in ループには表示されません。ただし、このアプローチは古いブラウザではサポートされていないことに注意することが重要です。互換性を確保するために、ES5-shim などの shim の使用を検討してください。

以上がFor-In ループを中断せずに配列およびオブジェクトのプロトタイプを安全に拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。