0

私のコードで奇妙なことが起こっています。私が観察しているのは、次のようなものです。

var prototype = {
    property : "",
    array : []
}

var objectArray = [];

function myFunction {
    objectArray[0] = Object.create(prototype);
    objectArray[1] = Object.create(prototype);

    objectArray[0].property = "Hello 1";
    objectArray[0].array.push("Hello 1");
    objectArray[1].property = "Hello 2";
    objectArray[1].array.push("Hello 2");

    // At this point when running the program I get:
    // objectArray[0].property == "Hello 1"
    // objectArray[1].property == "Hello 2";
    // objectArray[1].array == objectArray[1].array == prototype.array
    // == ["Hello 1", "Hello 2"]
}

私が欲しくて期待していたのは、2 つのオブジェクトの 2 つの別個の配列でした。ここで何が欠けていますか?

4

4 に答える 4

1

JavaScript では、オブジェクトは参照によってコピーされるため、両方のobjectArrayオブジェクトは単に同じオブジェクトへの参照です ( prototype)。new別のオブジェクトを作成するには、オブジェクトを複製するか、キーワードとコンストラクターを使用してインスタンスを作成する必要があります。

newキーワードを使用してそれを行う方法の例:

var prototype = function() {
    this.property = "";
    this.array = [];
};

objectArray[0] = new prototype();
objectArray[1] = new prototype();

次のこともできます。

var prototypeFactory = function() {
    return {
        property: "",
        array: []
    };
};

objectArray[0] = prototypeFactory();
objectArray[1] = prototypeFactory();
于 2012-11-27T12:47:59.433 に答える
0

「なぜそれは機能するのに、なぜ機能しpropertyないのarrayですか?」と自問していないのだろうか。実際には、どちらでもうまくいかずproperty、JavaScript がだまされています。

オブジェクトが同じプロトタイプを共有する場合、次のことを考慮する必要があります。

  • プロトタイプのすべてのプロパティは、そのプロトタイプから継承するオブジェクトによって共有されます。
  • プロトタイプのプロパティに割り当てることはできず、読み取るだけです(アクセサ プロパティでない限り、それは脇に置いておきます)。

ここで実際に何が起こっているのか:

objectArray[0].property = "Hello 1";
objectArray[1].property = "Hello 2";

「プロパティ」と呼ばれる新しい独自のprototype.propertyプロパティが各オブジェクトに作成されていますが、変更されていません。arrayプロパティに割り当てていないため、プロパティの動作が異なり、メソッドにアクセスprototype.arrayして呼び出しているpushためです。

于 2012-11-27T16:55:31.577 に答える
0

Object.create()これはまだ標準化されておらず、IE8 や FF3.6 では動作しないことを忘れないでください。オブジェクトを複製する簡単な回避策は、JSON オブジェクトを使用することです。

function clone(obj) {
  return JSON.parse(JSON.stringify(obj));
}
于 2012-11-27T17:11:28.453 に答える
0

オブジェクトはfor each オブジェクトprototypeと同じように存在します。[[Prototype]]を使用すると、新しいコピーが取得されませんObject.create()

プロトタイプチェーンをたどらない代入を使用する必要があります。

于 2012-11-27T12:48:00.957 に答える