で期待どおりに動作していない私は、次のコードで予期しない結果を得る:JavaScriptのprototypeプロパティは配列とオブジェクトフィールド
var TestModel, u, u2;
function TestModel() {}
TestModel.prototype.a = null;
TestModel.prototype.b = [];
u = new TestModel();
u.a = 1;
u.b.push(1);
u2 = new TestModel();
u2.a = 2;
u2.b.push(2);
console.log(u.a, u.b); // outputs: 1 [1,2]
console.log(u2.a, u2.b); // outputs: 2 [1,2]
を私はそれは驚くべきu.b
とu2.b
もTestModel
の各インスタンスかかわらず、同じ値が含まれていることを見つけますプロトタイプのセットアップ方法に応じて独自のインスタンス変数を持つ必要があります。だから、これは私が期待していた出力は次のようになります。私はオブジェクトで、配列としてそれを使用するのではなく、その上にキーを設定するb
を設定した場合
console.log(u.a, u.b); // expecting: 1 [1]
console.log(u2.a, u2.b); // expecting: 2 [2]
同じことが起こります。私はここで何を理解していないのですか?
どうもありがとう:
はあなたは、このような、独自の配列を持つように各インスタンスをしたいです!私はその微妙な違いを認識していませんでした。ですから、基本的には、他の場所で操作する前に、自分のコンストラクタのすべてのインスタンス変数を初期化する必要があります。 – hiddentao
@hiddentao:そうです。プリミティブ型をデフォルト値としてプロトタイプのプロパティに割り当てるのは問題ありませんが、 "インスタンスごと"の場合は、オブジェクトと配列をコンストラクタで初期化する必要があります。私は通常プロトタイプのプロパティを定義しますが、 'TestModel.prototype.a'のように' null 'で初期化します。 –
@Felix、あなたはTestModelの値の素晴らしいチャートを得るためにどのツールを使用していましたか? –