2015-03-02 115 views
1
var Main = function(){}; 
    Main.prototype = { 
     'times' : 0, 
     'request': function(){}, 
     ... 
    }; 

var SubA = function(){}; 
    SubA.prototype = new Main() // same with Object.create(Main.prototype); 
    SubA.prototype.constructor = SubA; 

var SubB = function(){}; 
    SubB.prototype = new Main() // same with Object.create(Main.prototype); 
    SubB.prototype.constructor = SubB; 

現在:Javascript類的繼承。子類更改主類的屬性?

var sub_a = new SubA(); 
    sub_a.times = 1; 

var sub_b = new SubB(); 
    // Here sub_b.times is already 1, how? 

當我改變sub類的Main性質也在發生變化,屬性它不應該停留在0

+2

對於我來說,使用Chrome控制檯時它保持0? – 2015-03-02 15:52:22

+0

不可複製。 – thefourtheye 2015-03-02 15:53:33

+1

'sub_a.times = 1;'永遠不會(!)改變'sub_b.times',除非'sub_a === sub_b'。這與原型無關。 *爲屬性賦值*總是添加或更改對象本身的屬性(無論它是否存在於原型鏈中)。 – 2015-03-02 16:25:24

回答

2

正如評論已經指出,您的確切問題是不正確的,實際上,sub_b.times仍然0。也許在你的代碼中正在發生其他事情。

我會猜想你的具體問題以外的會發生什麼,並通過下面的代碼解釋原始類型與參考類型。請注意我們的原型存儲timescount之間的區別:

var Main = function(){}; 
Main.prototype = { 
    'times' : 0, 
    'count': {value: 0} 
}; 

var SubA = function(){}; 
    SubA.prototype = new Main(); 
    SubA.prototype.constructor = SubA; 

var SubB = function(){}; 
    SubB.prototype = new Main(); 
    SubB.prototype.constructor = SubB; 

var subA = new subA(); 
var subB = new subB(); 

我們times屬性是一個原始值,當我們增加subA.times的原始值對subB的沒有影響,反之亦然:

console.log(subA.times); // 0 
console.log(subB.times); // 0 

subA.times = 1; 
console.log(subA.times); // 1 
console.log(subB.times); // 0 

subB.times = 100; 
console.log(subA.times); // 1 
console.log(subB.times); // 100 

但是,我們的count屬性是存儲value原語的對象。一個對象是一個引用類型,簡而言之,這意味着subA.countsubB.count引用內存中的同一個對象,如果我們改變該對象的屬性,它將反映在兩者中。 如果我不得不猜測,這可能是您的實際實施中可能發生的情況。

console.log(subA.count.value); // 0 
console.log(subB.count.value); // 0 

subA.count.value = 1; 
console.log(subA.count.value); // 1 
console.log(subB.count.value); // 1 

subB.count.value = 100; 
console.log(subA.count.value); // 100 
console.log(subB.count.value); // 100 

最後一點:如果我們決定將我們的實例之一的count財產重新分配給新的對象,然後就不再引用同一個對象,並會分開:

subA.count = {value: -1}; // New object 
console.log(subA.count.value); // -1 (new object value) 
console.log(subB.count.value); // 100 (old value from above) 

subB.count.value = 99; 
console.log(subA.count.value); // -1 
console.log(subB.count.value); // 99 
+0

謝謝,這正是發生了什麼事,我有一個對象計數和其他一些值。 – NestedWeb 2015-03-02 17:05:29