为什么在原型链上操纵属性实际上在对象上创建它?

时间:2015-08-29 17:02:05

标签: javascript prototype

我认为展示我所说的最佳方式是展示讲述故事本身的代码......

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

1 个答案:

答案 0 :(得分:3)

原型链仅用于解析价值。但是当您分配某些内容时,将在该对象上创建该属性。

你可以想到

cat1.lives -= 1;

作为

cat1.lives = cat1.lives - 1;

在这里,首先评估右侧表达式。因此,根据原型链,cat1.lives被解析为7。但是,在分配时,lives属性是在cat1对象本身上创建的。