我有一个示例类,它有两个属性:变量和对象:
var Animal, a, b;
Animal = (function() {
function Animal() {}
Animal.prototype.priceb = 4;
Animal.prototype.price = {
test: 4
};
Animal.prototype.increasePrice = function() {
this.price.test++;
return this.priceb++;
};
return Animal;
})();
a = new Animal();
console.log(a.price.test, a.priceb); // 4,4
b = new Animal();
console.log(b.price.test, b.priceb); // 4,4
b.increasePrice();
console.log(b.price.test, b.priceb); // 5,5
console.log(a.price.test, a.priceb); // 5,4 !! not what I would expect. Why not 4,4?
出于某种原因,这似乎有一种奇怪的行为。看起来该类存储了对象的引用,因此它在多个实例之间共享。
如何防止这种情况发生?
答案 0 :(得分:5)
原型中的对象(引用)确实在实例之间共享,直到引用本身被修改为止,而不是对象的内容。
解决方法是在构造函数中为每个对象赋予自己的.price
属性:
function Animal() {
this.price = { test: 4 };
}
您在Animal.prototype.priceb
中提供的(默认)原始值也最初在实例之间共享,除了一旦您修改它,实例就会获取自己的副本,该副本会影响原型的原始值。