javascript函数this和prototype

时间:2016-12-16 04:05:49

标签: javascript function properties this

代码如下:



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有自己的这个,所以你如何编辑这个[property]你不能改变它自己的this.value;

属性声明如此共享属性?是正确的 ? 但是当obj改变时会影响b.obj, 当城市变化不会影响b.city?

2 个答案:

答案 0 :(得分:4)

两个对象的原型链中都有cityobj。但是,如果您执行a.city = "American",则city上创建一个新属性 a,隐藏属性链中的属性city。<登记/> 分配给属性(几乎)总是在对象本身上创建该属性。

a.obj.age = 20;读取(不分配!)a.obj引用的对象并更新其age属性。 ab具有相同的原型,因此a.objb.obj会解析为同一个对象。如果对象以任何方式发生变异,它将以同样的方式影响ab

Chrome控制台的结构:

enter image description here

答案 1 :(得分:1)

让我们逐行说明:

  • 首先,A.prototype指向一个对象。
  • 当您运行var a = new A();
    1. 您创建一个设置为'this'的新对象
    2. 此新对象的属性nameobj2的值为kl{ a: 1 }
    3. 此对象链接到A.prototype指向的对象,因此建立了原型链。
    4. function A的末尾,该函数实际运行return this;,它实际上返回创建的对象以分配给a
  • var b = new A();与上面的内容相同
  • 当您运行a.name = "kobe";时,您正在将值从kl修改为kobe
  • 当您运行a.city = "American";时,您在city本身上创建了一个新属性a
  • 当您运行a.obj2.a = 30;时,您也只是修改了一个值。
  • 但是当你运行a.obj.age = 20;时,情况有所不同
    • a本身没有属性obj,因此它将原型链向上移动到对象A.prototype指向,并找到属性obj,所以这行代码实际上修改了obj,并将obj.age的值从30更改为20.
  • 执行b.name时,由于b的属性name的值为kl,因此会打印kl
  • 但是,b本身没有属性city,因此它将原型链上升到对象A.prototype指向并查看是否可以找到一个,它确实像以前一样运行A.prototype.city = "china";,因此它会打印china
  • 运行console.log(b.obj);时,b会转到原型链并找到对象obj上指向的A.prototype,因此会打印{age: 20} < / LI>