0

プリミティブ型が共有されていないのに、配列が 2 つのインスタンス間で共有される理由がわかりません。誰か説明してくれませんか?

MyObject = function() {};
MyObject.prototype = {anArray : [],aString : ''};
var c1 = new MyObject();
c1.aString = 'a';
c1.anArray.push('a');
var c2 = new MyObject();
console.log(c2.aString);
console.log(c2.anArray);
4

2 に答える 2

2

文字列は不変、配列は変更可能です。文字列を置き換えていますが、配列を変更しています。

配列を変更する代わりに上書きすると、配列と文字列の間で同じ動作が得られます。

MyObject = function() {};
MyObject.prototype = {anArray : [],aString : ''};

var c1 = new MyObject();
c1.aString = 'a';
c1.anArray = []
c1.anArray.push('a');

var c2 = new MyObject();
console.log(c2.aString); // ''
console.log(c2.anArray); // []

prototypeしたがって、すべてのインスタンスがその変更を監視できるようにすることを計画している場合にのみ、オブジェクトまたは配列を配置することは理にかなっています。それ以外の場合は、インスタンスに直接配置してください。

MyObject = function() {
    this.anArray = [];
};
MyObject.prototype = {aString : ''};
于 2012-05-08T17:32:56.353 に答える
1

割り当てるとき

c1.aString = 'a'

プロトタイプのフィールドに割り当てていません。aStringという名前の新しいフィールドがオブジェクトにaString直接作成され、プロトタイプではフィールドが非表示になります。c1aString

そんな中、電話すると

c1.anArray.push('a');

にはanArrayフィールドがないため、 in プロトタイプc1を参照しています。anArrayこれをテストするには、次のようにします。

c1.anArray = new Array();

anArrayまた、新しいプロパティが で作成され、プロトタイプにc1干渉していないことに注意してください。anArrayこの場合、

console.log(c1.anArray);
console.log(c2.anArray);

まだプロトタイプ内c2を参照しているため、異なる結果になります。anArray

オブジェクトとプロトタイプ (またはプロトタイプ チェーンのさらに先) の両方に同じ名前のフィールドがあり、このフィールドの値を要求した場合、インタプリタは最初にオブジェクトを直接調べてから、どこかでフィールドが見つかるまでプロトタイプチェーン。

ただし、フィールドに値を割り当てる場合は、常にオブジェクト内で直接行われ、プロトタイプでは行われません。

于 2012-05-08T17:29:03.140 に答える