2016-12-16 114 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