2016-12-16 168 views
0

的代碼如下:javascript函數這和原型

function A() { 
 
    this.name = "kl"; 
 
    this.obj2 = { a: 1 }; 
 
} 
 

 
A.prototype.city = "china"; 
 
A.prototype.obj = {age: 30}; 
 

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

 
a.name = "kobe"; 
 
a.obj.age = 20; 
 
a.city = "American" 
 
a.obj2.a = 30; 
 

 
console.log(b.name); // k1 
 
console.log(b.city); // why china ? 
 
    
 
console.log(b.obj);  // when b.city = china, why b.obj = {age: 20} 
 
console.log(b.obj2); // {a: 1}

我的看法是,A和B都有自己的這一點,所以你如何修改這個[屬性]你不能改變自己的this.value;

property declare so share property?是對的 ? 但是當obj是變化時會影響b.obj, 當城市變化不會影響b.city?

+1

這是很少,你將要使用的原型機制,分享價值的情況下在實例中。它會導致難以理解的行爲,比如你發現的行爲。將原型視爲**方法**在實例間共享的存儲庫是比較安全的。 – 2016-12-16 04:43:21

回答

4

兩個對象cityobj在他們的原型鏈。但是,如果你做a.city = "American"a創建一個新屬性city本身,在產業鏈的陰影屬性city
分配給屬性將(幾乎)總是在對象本身上創建該屬性。

a.obj.age = 20;然而讀取(不轉讓!)通過a.obj引用的對象,並更新其age財產。 ab具有相同的原型,因此a.objb.obj解析爲相同的對象。如果對象以任何方式變異,它將以相同的方式影響ab。從Chrome控制檯

結構:

enter image description here

+0

哦,非常感謝,很明顯,我很清楚! – kelen

1

讓我們通過此行,行:

所有的
  • 首先,A.prototype指向的對象。
  • 當您運行var a = new A();
    1. 創建它被設置爲「本」
    2. 這個新的對象有哪些具有價值kl{ a: 1 }
    3. 此對象鏈接到屬性nameobj2一個新對象對象A.prototype指向,從而建立一個原型鏈。
    4. function A的末尾,該函數實際上運行return this;,它實際上返回創建的對象以分配給a
  • var b = new A();做上述相同
  • 當您運行a.name = "kobe";,你在a本身
  • 修改從 klkobe
  • 當您運行a.city = "American";,你要創建一個新的屬性city
  • 當您運行a.obj2.a = 30;時,您也只修改一個值。
  • 但是,當你運行a.obj.age = 20;,東西是不同的
    • a沒有財產obj本身,所以它上升原型鏈的對象A.prototype點,並找到物業obj,所以這行代碼實際上修改obj,和當執行b.name,由於b具有屬性name與VA改變的obj.age從30到20
  • 值略kl,所以它打印kl
  • 然而,b沒有財產city本身,所以它上升原型鏈的對象A.prototype點,看看它是否能找到一個,它的確,正如前面你跑了A.prototype.city = "china";,所以它打印china
  • console.log(b.obj);運行,b上升到原型鏈和對象上找到objA.prototype點,所以它打印{age: 20}
+0

謝謝,你的回答很棒! – kelen