2010-12-27 5 views
4

インスタンスaのプロパティを変更すると、インスタンスbの同じプロパティが変更される理由がわかりません。JavascriptのOOPを理解する:他のインスタンスを変更するインスタンス

var A = function(){ 

}; 

A.prototype.data = { 
    value : 0 
}; 

var a = new A(); 
var b = new A(); 

console.log(a.data.value, b.data.value); // 0, 0 
a.data.value = 5; 
console.log(a.data.value, b.data.value); // 5, 5 

は、プロトタイプのキーワードはdata変数インスタンス変数を作るべきではないでしょうか。

これは期待通りに実行される。この例では場合ではないと思わ:

var B = function(){ 
    this.data = { 
     value : 0 
    }; 
}; 

var i = new B(); 
var j = new B(); 

console.log(i.data.value, j.data.value); // 0, 0 
i.data.value = 5; 
console.log(i.data.value, j.data.value); // 5, 0 

私はプロトタイプの方法が仕事を文句を言わない理由として困惑しています。たぶん私はいくつかの概念的な知識が欠けているでしょう。

答えて

0

jsのプロトタイプは、そのクラスのすべてのインスタンス間で共有されるです。これは、古典的なoop言語の静的変数のようなものです。実行時にメモリを節約するために、.prototypeにいくつかのメソッド/フィールドを入れると便利なことがあります。

3

それは本当にこれをやっているので:

var A = function(){ 

}; 

var someObj = { value:0 }; 

A.prototype.data = someObj; 

だからのすべてのインスタンスは現在のオブジェクトsomeObjを指すdataという名前のプロパティを持っています。すべてのインスタンスにわたって、これは同じオブジェクトです。そして、そのオブジェクト内のvalueを変更しています。

Aは、valueを所有していません。これは、valueを所有するオブジェクトへの参照を保持します。

1

prototypeキーワードでは、データ変数をインスタンス変数にしないでください。

これはまったく逆です。 A.prototypeAによって作成されたすべてのオブジェクトによって共有されます。 Aによって作成されたオブジェクトをインデックスするとき、インデックスが存在しない場合、JavaScriptはオブジェクトのプロトタイプ(例:o.constructor.prototype)でそのインデックスを解決しようとします。この場合、abにはdataというインデックスが付けられていますが、これらのオブジェクトには存在しないため、プロトタイプにそのインデックスが使用されます。

0

ちょうど反対です。プロトタイプはすべてのインスタンスで共有されます。 JavaScriptはプロトタイプ言語であり、古典的なOO言語よりも一般的です。私は良いサマリーは Prototypal inheritanceです。 io languageについては、JavaScriptをよりよく理解するのに役立つ、より純粋なプロトタイプ言語であることについて少し学ぶかもしれません。

関連する問題