2015-10-05 47 views
0

我用Node.JS寫了一個項目和一些奇怪的事情。不知怎的,如果我叫test1.changeObjName()它改變了該類的所有實例的值:設置對象的JavaScript類,然後改變它以某種方式改變了所有實例的對象

var myObj = {"name":"test"}; 
var myClass = function(){ 
    this.obj = myObj; 
    this.changeObjName = function(){ 
     this.obj.name ="newValue"; 
    }; 
}; 
var test1 = new myClass(); 
var test2 = new myClass(); 

test1.changeObjName(); 

console.log(test1.obj.name); //returns "newValue" 
console.log(test2.obj.name); //returns "newValue" 

爲什麼test1.changeObjName();變化test2.obj.name太值?現在,如果我將this.obj的定義更改爲:

var myClass = function(){ 
    this.obj = {"name":"test"}; 
    this.changeObjName = function(){ 
     this.obj.name ="newValue"; 
    }; 
}; 
var test1 = new myClass(); 
var test2 = new myClass(); 

test1.changeObjName(); 

console.log(test1.obj.name); //returns "newValue" 
console.log(test2.obj.name); //returns "test" 

它按照我的預期工作。這裏有什麼區別?

回答

0

它們都具有相同的this.obj你這麼做的時候:

this.obj = myObj 

注意,這只是把對象通過構造坐在外面,每一項任務(即當您初始化類)將跟蹤參考外面的對象。因此每個對象將具有相同的this.obj,即myObj。更重要的是,在實例化下一個對象之前所做的任何更改也會應用於新對象。

儘管在第二個示例中,您正在爲每個實例創建一個新對象。換句話說,每個this.obj對於每個構建的對象都是不同的。