2014-03-07 44 views
0

如果在原型中定義一個成員在一個對象的所有實例中共享一個成員,那麼是否更改該成員的值也會爲所有對象更改它?在原型中定義的值是否共享?

var A = function() {}; 
A.prototype.value = 1; 
A.prototype.getValue = function() { 
    return this.value; 
}; 

var B = function() {}; 
B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 

var a = new A(); 
document.writeln("a constructor is A = " + (a.constructor === A) + "<br>"); 
document.writeln("a.value = " + a.value + "<br>"); 
document.writeln("a.getValue() = " + a.getValue() + "<br>"); 
a.value += 1; 
document.writeln("a.value = " + a.value + "<br>"); 
document.writeln("a.getValue() = " + a.getValue() + "<br>"); 

var b = new B(); 
document.writeln("b constructor is B = " + (b.constructor === B) + "<br>"); 
document.writeln("b.value = " + b.value + "<br>"); 
document.writeln("b.getValue() = " + b.getValue() + "<br>"); 
b.value += 1; 
document.writeln("b.value = " + b.value + "<br>"); 
document.writeln("b.getValue() = " + b.getValue() + "<br>"); 

var bb = new B(); 
document.writeln("bb constructor is B = " + (bb.constructor === B) + "<br>"); 
document.writeln("bb.value = " + bb.value + "<br>"); 
document.writeln("bb.getValue() = " + bb.getValue() + "<br>"); 
bb.value += 1; 
document.writeln("bb.value = " + bb.value + "<br>"); 
document.writeln("bb.getValue() = " + bb.getValue() + "<br>"); 

結果我得到的是:

a constructor is A = true 
a.value = 1 
a.getValue() = 1 
a.value = 2 
a.getValue() = 2 

b constructor is B = true 
b.value = 1 
b.getValue() = 1 
b.value = 2 
b.getValue() = 2 

bb constructor is B = true 
bb.value = 1 
bb.getValue() = 1 
bb.value = 2 
bb.getValue() = 2 

這是我一直在使用這種嘗試一個普拉克。 http://plnkr.co/edit/znckausaYi9cQ2glJg1A

如果值是在原型,爲什麼B和BB似乎有一些有價值的單獨的實例?我預期的BB,結果是這樣的:

bb constructor is B = true 
bb.value = 2 
bb.getValue() = 2 
bb.value = 3 
bb.getValue() = 3 

問題:

  • 這是爲什麼表現如此?
  • 有沒有辦法來驗證原型的成員的位置?
  • 是否有一個工具,我可以用它來證明成員跨實例共享與每個實例的一員?

回答

1

獲得的值返回該鏈中的最接近的值。設置一個值將其設置在當前對象上,並且原型鏈將被忽略。

0

a.value不是A.prototype.value的參考。

可以例如也在做:

a.getValue = function() { return 2; } 

這不會改變getValue功能的A其他情況下,甚至原型A定義。


你在做什麼是類似於:

class A { 
    var value = 1; 
    function getValue() { 
     return this.value; 
    } 
} 
var a = new A(); 
a.value += 1; 

我想你混淆做:

A.value += 1; // note this can not be done in any classical language that I know 

在JS,你會怎麼做:

A.prototype.value += 1; 

這不影響a,在此之後創建的新實例A

0

使用new創建對象時,會創建一個與先前創建的對象不相關的新實例。它們只有共享相同的構造函數。

var A = function() {}; 
A.prototype.value = "a value"; 


var B = function() {}; 
B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 

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

console.log(a.value); // a value 
console.log(b.value); // a value 

a.value = "new a value"; 

console.log(a.value); // a new value 
console.log(b.value); // a value 

b.value = "new b value"; 

console.log(a.value); // new a value 
console.log(b.value); // new b value