我认为展示我所说的最佳方式是展示讲述故事本身的代码......
function Animal() {this.lives=7;}
function Cat() {}
Cat.prototype = new Animal();
cat1 = new Cat();
for (var i in cat1) { if (cat1.hasOwnProperty(i)) { console.log(i);}}
//undefined --as expected since property lives exists in prototype chain, Cat.prototype.
//but when i do this
cat1.lives -= 1;
// and now if i run this again
for (var i in cat1) { if (cat1.hasOwnProperty(i)) { console.log(i);}}
// lives -- How?? I just manipulated property in proto chain i didnt do obj.val = 3; which would create a new property.
只是为了完成..如果我这样做
Cat.prototype.lives = 10;
然后
cat1.prototype.lives; // 6
答案 0 :(得分:3)
原型链仅用于解析价值。但是当您分配某些内容时,将在该对象上创建该属性。
你可以想到
cat1.lives -= 1;
作为
cat1.lives = cat1.lives - 1;
在这里,首先评估右侧表达式。因此,根据原型链,cat1.lives
被解析为7
。但是,在分配时,lives
属性是在cat1
对象本身上创建的。