3

newJavaScriptで演算子を使用してオブジェクトを作成するときの変数のスコープはありますか?

function A(){
   this.a = 1; // instance property
}

function B(){ 
   this.a = 3; // instance property
}

ケース 1 :了解しました

// assign again prototype a property as 2 
A.prototype.a = 2 ;// prototype property

var obj = new A();

console.log( obj instanceof A );
console.log( obj.a == 1 ); 

ケース 2 : A コンストラクターを B 参照に変更

A.prototype.constructor =  B;
A.prototype.a = 2 ;// prototype property


var obj = new A();
console.log( obj instanceof B ); // false, as I expected
console.log( obj.a == 1 ); // still 1 why ?

ケース 3 : 継承スコープ

A.prototype = new B();
A.prototype.a = 4 ;// prototype property


var obj = new A();
console.log( obj instanceof B ); // true , as I expected
console.log( obj.a == 1 ); // still 1 why ?

いくつかの調査を行いましたが、これについての正しい説明が見つかりませんでした。

4

2 に答える 2

5

オブジェクトの初期化コードが実行される前に、プロトタイプがオブジェクトに割り当て/バインドします

> function A() { console.log(this.a); this.a = 1; console.log(this.a); };
undefined
> new A();
undefined
1
A {a: 1}
> A.prototype.a = 2;
2
> new A();
2
1
A {a: 1, a: 2}

関数の初期化コード内で、Aa のプロトタイプが割り当てられる前に、最初の console.log が未定義でした。プロトタイプ Aa が割り当てられた後、最初の consol.log が (2) として正しく表示され、次に this.a が 1 として割り当てられ、2 番目の console.log が (1) として正しく表示されました。

于 2013-07-11T13:43:20.727 に答える
4

プロトタイプ チェーンは、オブジェクト自体に独自のプロパティが見つからない場合にのみ検索されます。すべての例ではa、コンストラクターで定義されたインスタンスにプロパティがあります。

ケース 2 で、objのインスタンスになることを期待しない場合B(そして、B呼び出されない場合)、なぜ になると期待obj.aするのでしょ1うか? ケース1とまったく同じです。唯一の違いは、obj[[Prototype]] が誤解を招くコンストラクタプロパティを持っていることです。

ケース3も同様です。基本的に、すべての例は同じでobj.aあり、構築時に定義されa、オブジェクトのプロトタイプチェーンから同じ名前のプロパティを隠します。

于 2013-07-11T13:44:43.600 に答える