2016-05-11 6 views
0

次の関数では、aとbが独自のバージョンの配列を持つことを期待していたため、出力がfalseであることが予想されますが、trueを出力します。誰も説明してください、なぜですか?コンストラクタ関数クロージャ変数

function Test() { 
    var a = [1,2,3]; 
    Test.prototype.getArray = function() { return a; }; 
} 

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

console.log(a.getArray() === b.getArray()); 
+0

'this.getArray'を' Test.prototype.getArray'にしたくありません。 – Bergi

答えて

2

すべてTestオブジェクトは同じプロトタイプを継承します。 正確なプロトタイプ。プロトタイプ関数を上書きするので、その型のすべてのオブジェクトに対して上書きします。

例:

function log(msg) { 
 
    document.querySelector('pre').innerText += msg + '\n'; 
 
} 
 

 
function Person(name) { 
 
    this.name = name; 
 
} 
 
Person.prototype.sayHello = function() { 
 
    log('Hello, ' + this.name); 
 
}; 
 

 
var bob = new Person('Bob'); 
 
var alice = new Person('Alice'); 
 
bob.sayHello(); 
 
alice.sayHello(); 
 

 
// Overwriting the prototype function 
 
Person.prototype.sayHello = function() { 
 
    log('Goodbye, ' + this.name); 
 
}; 
 
bob.sayHello(); 
 
alice.sayHello();
<pre></pre>

どうしても標準のコンストラクタを使用して、関数内でのプライベートデータにアクセスする必要がある場合は、コンストラクタ自体の内部で関数を定義する必要があります。

これは、多くの実装でプロトタイプの継承から得られる多くの領域とパフォーマンスの最適化を無効にすることに注意してください。

関連する問題