プロトタイプ プロパティがすべてのインスタンスで共有されていることは事実です。問題は、prototype プロパティを決して変更しないことです。いくつかの追加のログを使用してフィドルを見てください。
"use strict";
var ConstructorFunction = function () {};
ConstructorFunction.prototype = {
counter: 0,
count: function () {
return ++this.counter;
}
};
var a = new ConstructorFunction();
var b = new ConstructorFunction();
$("#output").append(a.hasOwnProperty("counter") + " "); //false
a.count();
$("#output").append(a.hasOwnProperty("counter") + " "); //true
ご覧のとおり、 を呼び出すとすぐに、++this.counter
それ以降使用されるローカル プロパティが作成されます。
私はこれが起こると仮定します:
++this.counter
と解釈されthis.counter = this.counter + 1
ます。まず、等号の右の部分が評価され、インスタンスにはcounter
プロパティがないため、プロトタイプのカウンター プロパティが使用されます。このプロパティの値は 1 に追加され、次に に割り当てられます。this.counter
これにより、 のような、まったく存在しないプロパティを割り当てる場合と同じ方法で、ローカル プロパティが作成されますa.xy = 1
。xy
その場合、インスタンスのローカル プロパティになります。
編集
プロトタイプ プロパティを引き続き使用できる 2 つの回避策があります。
count
1)メソッド内でプロトタイプ プロパティを明示的に設定します。
ConstructorFunction.prototype.count = function() {
return ++this.constructor.prototype.counter;
};
2) count メソッドを呼び出し、apply
プロトタイプをコンテキストとして使用します。
a.count.apply(a.constructor.prototype);
しかし、あなたが行った方法でプロパティを設定するprototype
と、これらの方法の両方で問題が発生します。
ConstructorFunction.prototype = {
//...
};
これは完全なプロトタイプ オブジェクトをオーバーライドするため、そのコンストラクタ プロパティもオーバーライドされます。コンストラクタ プロパティは、プロトタイプ チェーン内の次の上位オブジェクトであるオブジェクトを指すようになりObject
ます。これを修正するには、プロトタイプ オブジェクトを割り当てた後にコンストラクターを手動で設定します。
ConstructorFunction.prototype.constructor = ConstructorFunction;
または、プロトタイプ オブジェクトのすべてのプロパティを個別に割り当てます。
ConstructorFunction.prototype.counter = 0;
ConstructorFunction.prototype.count = function () {
return ++this.counter;
};