6

次のコードがあります。

var A = function() {};
var a = new A();
var b = new A();
A.prototype.member1 = 10;

A.prototype = {}
var c = new A();
console.log(a.member1);
console.log(a.constructor === b.constructor);
console.log(a.constructor === c.constructor);
console.log('---------');
console.log(c.member1);

出力は次のとおりです。

10
true
false
---------
undefined
undefined

とのプロトタイプは変更されておらず、新しいものをa持っていました。これは が に等しくなく、それぞれが独自の を持っていたという事実によって引き起こされたというのは正しいですか? 2 つのオブジェクトのコンストラクターが等しくない可能性がある他の循環はありますか?bca.constructorc.constructorprototype

追加の質問: なぜ 2 つの文字列が印刷されたのundefinedですか? (クロム)

4

3 に答える 3

5

電話している時間に

var a = new A();

基本的に、この割り当ては行われます:

a.__proto__ = A.prototype;

次に、A.prototypeを新しいオブジェクトに再割り当てするため、プロトタイプとしてc取得します。{}

A.prototype = {};
var c = new A();

A.prototypeただし、これは古いオブジェクトを破棄しません-a.__proto__まだそれを指しています。

これは、 a.constructor が c.constructor と等しくなく、それぞれに独自のプロトタイプがあるという事実によって引き起こされたというのは正しいですか?

.constructorは基本的に単なる便利なプロパティです。インスタンスの動作には影響しません。

追加の質問: 2 つの未定義の文字列が出力されたのはなぜですか?

私のコンソールにはありません。(オペラ12)

于 2012-08-22T20:05:54.613 に答える
2

__proto__オブジェクトを作成すると、コンストラクターのプロトタイプが新しいオブジェクトのプロパティに割り当てられます。次に、プロトタイプを変更していますが、2 つの オブジェクトabオブジェクトは既に元の参照を指しています。

var a = new A();
// a.__proto__ == A.prototype == {} (soon == {member1:10})
var b = new A();
// b.__proto__ == A.prototype == {} (soon == {member1:10})

A.prototype = {} // this changes A.prototype, but not a.__proto__ or b.__proto__
var c = new A(); // c.__proto__ = {}

あなたの最初undefinedはからc.member1です。2番目のものはクロムで、ステートメント全体に戻り値がなかったと言っています

于 2012-08-22T20:06:33.677 に答える
2

答えは、コードの次の行にあります。

A.prototype = {}

このコード行に到達すると、実際には {} である BRAND NEW OBJECT がメモリ内に作成されます。コンストラクターとして A を使用して新しいオブジェクトを作成すると、この BRAND NEW OBJECT がプロトタイプとしてポイントされます。

ただし、OLD PROTOTYPE はメモリ内にまだ存在します。A.prototype がそれを指しなくなっただけです。A のプロトタイプ参照を再定義する前にコンストラクタとして A を使用して作成したオブジェクトは、プロトタイプとしてこの OLD PROTOTYPE をまだ指しています。

于 2012-08-22T20:07:52.387 に答える