代码如下:
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?
答案 0 :(得分:4)
两个对象的原型链中都有city
和obj
。但是,如果您执行a.city = "American"
,则在city
上创建一个新属性 a
,隐藏属性链中的属性city
。<登记/>
分配给属性(几乎)总是在对象本身上创建该属性。
a.obj.age = 20;
但读取(不分配!)a.obj
引用的对象并更新其age
属性。 a
和b
具有相同的原型,因此a.obj
和b.obj
会解析为同一个对象。如果对象以任何方式发生变异,它将以同样的方式影响a
和b
。
Chrome控制台的结构:
答案 1 :(得分:1)
让我们逐行说明:
A.prototype
指向一个对象。var a = new A();
时
name
和obj2
的值为kl
和{ a: 1 }
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>