最初に例を見てみましょう:
//中毒object.protopeobject.prototype.bar = 1; var foo = {moo:2}; for(var i in foo){console.log(i); // barとmooの両方を印刷}ここで2つのポイントに注意を払う必要があります。 1つは、for in loopは、列挙に設定された属性をfalseに無視することです。たとえば、配列の長さプロパティ。第二に、プロトタイプチェーン全体を横断するため、プロトタイプチェーンが長すぎると、パフォーマンスに影響を与えます。
列挙可能は非常に奇妙な言葉です。実際、JavaScriptでその影を見つけることは困難であり、実際にRubyから著者から借りています。列挙可能を作成する目的は、独立して使用することではなく、「混合」方法を使用することです。プロトタイプの多くの方法は列挙可能であるため、プロトタイプの礎石と言えます。ここで詳細な紹介はしません。詳細を参照してください - 列挙可能。
in loop自体の動作を変更することはできないため、ループに表示されたくないプロパティを除外するために他の方法しか使用できません。 「JavaScript Learning Notes Objects(III):HasownProperty」を通じて、HasownPropertyメソッドがこれを行うことができることがわかっています。
hasownPropertyを使用してフィルター
まだ前の例を使用してください:
//中毒object.protopeobject.prototype.bar = 1; var foo = {moo:2}; for(var i in foo){if(foo.hasownproperty(i)){console.log(i); }}これがそれを書く唯一の正しい方法です。 HasownPropertyメソッドを使用したため、今回はMOOのみを出力します。 HasownPropertyメソッドが適用できない場合、Object.Prototypeが拡張されたときにエラーが表示されます。
これで、多くのフレームワークがObject.prototypeからメソッドを拡張することを選択するため、これらのフレームワークを使用すると、HasownPropertyでフィルタリングされていないループを使用すると問題が発生します。
要約します
ネイティブプロトタイプオブジェクトが拡張されているかどうかにかかわらず、HasownPropertyフィルタリングプロパティの適切な習慣を開発することをお勧めします。