1:
function f(){}:
f.prototype={x:function(){}}b =new f()
c=new f()
c.x=10
console.log(c.x)
console.log(b.x)
2:
function f(){}
f.prototype={x:1}
b =new f()
c=new f()
c.x=10
console.log(c.x)
console.log(b.x)
3:
function f(){}
f.prototype={x:{a:1}}
b =new f()
c=new f()
c.x['a']=10
console.log(c.x['a'])
console.log(b.x['a'])
4:
function f(){}
f.prototype={x:[1,2,3]}
b =new f()
c=new f()
c.x[1]=10
console.log(c.x[1])
console.log(b.x[1])
以上的代码中,1,2中的输出是不一样的,他们都遵循了原型链只在取值时起作用的原则,这两种情况中,c.x=10只是在c的对象空间新建了一个属性,而原型中的x并没有被改变,他还是function(){},我们可以通过c.__proto__.x去访问他,但是3,4中的输出是一样的,所以当是数组或对象这种形式的时候,情况就会不一样,但是如果我们定义的是和原型中的数组或者对象同名的变量,则会发生覆盖(比如c.x=10而不是c.x['a']=10),否则不管是取值还是赋值,针对的都是原型中的变量,原因在于x[1]或者x['a']不是合法的变量名,所以无法创建一个变量对原型中的同名变量进行覆盖。所以这时候会影响原型,从而影响链接到原型的所有对象。