JavaScript では、オブジェクトのプロパティは 2 つの方法で定義できます。オブジェクト上で直接定義するか、オブジェクトのプロパティとして定義します。オブジェクトのプロトタイプ。この動作は、配列を扱うときに重大な影響を及ぼします。
デフォルトでは、プロトタイプ化された配列はクラスのすべてのインスタンス間で共有されるため、予期しない動作が発生します。たとえば、クラスのプロトタイプに空の配列が含まれている場合、すべてのインスタンスは同じ配列を参照します。これは、次の例で確認できます。
function Sandwich() { // Uncomment to fix the problem //this.ingredients = []; } Sandwich.prototype = { "ingredients": [], "addIngredients": function(ingArray) { for(var key in ingArray) { this.addIngredient(ingArray[key]); } }, "addIngredient": function(thing) { this.ingredients.push(thing); } }; var cheeseburger = new Sandwich(); cheeseburger.addIngredients(["burger", "cheese"]); var blt = new Sandwich(); blt.addIngredients(["bacon", "lettuce", "tomato"]); print_r("Cheeseburger contains:", cheeseburger.ingredients);
この例では、チーズバーガーと blt の両方が、異なるインスタンスであっても、同じ材料配列を共有します。チーズバーガーに材料を追加すると blt にも影響があり、配列の共有性質が強調されます。
この動作を修正するには、プロトタイプのプロパティとしてではなく、オブジェクト自体に直接配列を定義することをお勧めします。これにより、各インスタンスが独自のプライベート配列を持つことが保証されます。コードに対する次の変更により、問題が修正されます。
function Sandwich() { this.ingredients = []; }
コンストラクターで配列を定義すると、Sandwich の各インスタンスは配列の独自のプライベート コピーを持つことになり、共有動作が排除されます。
要約すると、プロトタイプ化された配列は、JavaScript のクラスのすべてのインスタンス間で共有されます。各インスタンスのプライベート配列を作成するには、コンストラクターでオブジェクト自体に配列を直接定義する必要があります。この区別は、JavaScript でのオブジェクトの動作を理解して管理するために重要です。
以上がJavaScript オブジェクトのメンバーは配列としてプロトタイプ化され、共有またはプライベートですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。