2012-01-04 6 views
4

なぜfooAとfooBの結果が異なるのか分かりません。foo.prototyp.x =&foo.prototype = {x:}の違い

var foo = function(){} 

fooA = new foo(); 

foo.prototype.x = 1; 
foo.prototype = { y: 2, z: 3}; 

console.log(fooA.x, fooA.y, fooA.z);// 1, undefined, undefined 

fooB = new foo(); 
console.log(fooB.x, fooB.y, fooB.z);// undefined, 2, 3 
  1. foo.prototypは= {}の前に定義されたメソッドをオーバーライドしていますか?

  2. fooAがprototype.xの前の状態である理由は、結果を継承しますが、yとzは継承しないのはなぜですか?

+1

'Foo.prototypeは= {}' '実際Foo'を対象としてあるものを再定義しているが、あなたはただ前と変更後定義されたインスタンス間でキャッチしています。 'console.log(FooA);を使ってください。 console.log(FooB); 'の違いをはっきりと見てください。 –

答えて

4

その行動の理由はfoo.prototype = { y: 2, z: 3};を使用して、コンストラクタのprototypeプロパティを新しい値に設定されている場合、既存のオブジェクトのプロトタイプが変更されないときは、新しいオブジェクトにfoo.prototypeポイントを作るということです。何が起こるかの

ライン・バイ・ラインの説明:

var foo = function(){}
foo.prototypeは空のオブジェクト(このオブジェクトAを呼ぶ)として初期化されます。

fooA = new foo()
fooAが新しいfooというオブジェクトに設定されている、それはfoo.prototypeA)にその原型が設定されています。

foo.prototype.x = 1
fooAのプロトタイプがfoo.prototypeと同じオブジェクトであるため、fooA.xAプロパティx = 1を取得し、換言すれば、1になります。

foo.prototype = { y: 2, z: 3};
我々は性質y = 2z = 3を持つ新しいオブジェクトを作成します。このオブジェクトをBと呼びます。 foo.prototypeが新しいオブジェクトに設定されます。

console.log(fooA.x, fooA.y, fooA.z);
fooAのプロトタイプはまだのみx = 1性質を持っているA、です。

fooB = new foo();
私たちは、そのプロトタイプBある新しいFOOオブジェクトを作成します。

console.log(fooB.x, fooB.y, fooB.z);
fooBのプロトタイプがプロパティy = 2z = 3ではなく、プロパティxを有し、Bです。

+0

あなたはそのような...感謝します。 – Huang

2

var foo = function(){} 

fooA = new foo(); 

foo.prototype.x = 1; 
console.log(fooA.__proto__) // {x:1} 

foo.prototype = { y: 2, z: 3}; 
console.log(fooA.__proto__) // still {x:1} 

オブジェクトのプロトタイプが(newを呼び出すときに)作成時に割り当てられ、その後変更されません考えてみましょう。 詳細はhereを参照してください。

1

この

F.prototype = { ... }; 

はコンストラクタFprototypeオブジェクトを置き換えます。古いprototypeオブジェクトは新しいprototypeオブジェクトに置き換えられます。 F

var f = new F(); 

インスタンスは、コンストラクタFprototypeオブジェクトを参照暗黙プロトタイプリンクを有します。ただし、この参照はインスタンスの初期化中に確立されます。

f2のプロトタイプのリンクは新しいprototypeオブジェクトを参照しながら、例ここで

var f1 = new F(); 
F.prototype = { ... }; 
var f2 = new F(); 

について、f1のプロトタイプのリンクは、古いprototypeオブジェクトを参照します。 F.prototypeオブジェクトが交換されているにもかかわらず、古いprototypeオブジェクトは限り、そのプロトタイプリンクそれを参照Fの少なくとも1つのインスタンスがあるよう存在し続けること

は注意してください。

関連する問題