更改javascript对象内对象属性的值会影响其他对象

时间:2015-08-10 07:20:48

标签: javascript object-literal

我想在对象内部更改对象的属性。但是,当我这样做时,使用相同原型创建的其他对象属性也发生了变化。

代码如下:

var a = {
  x: { y: 'foo' }
}

var b = Object.create(a)
var c = Object.create(a)

console.log(a.x.y) // 'foo'
console.log(b.x.y) // 'foo'
console.log(c.x.y) // 'foo'

b.x.y = 'bar'

var d = Object.create(a)

console.log(a.x.y) // 'bar'
console.log(b.x.y) // 'bar'
console.log(c.x.y) // 'bar'
console.log(d.x.y) // 'bar'

我认为问题是因为所有对象引用相同的x,因此从所有对象中反映的任何对象改变y。任何人都可以解释这里发生了什么,也许可以参考和建议解决方法吗?

3 个答案:

答案 0 :(得分:2)

x是一个对象,这就是为什么它被一个指针引用而不是像字符串一样被引用的原因。

请尝试以下解决方法:

b.x = { y: 'bar' } // instead of b.x.y = 'bar'

这会创建一个与其他对象不同的新对象x

答案 1 :(得分:1)

Object.create创建一个新对象,并将其原型设置为传入的第一个参数。在您的情况下,这是一个对象的实例(a),但您使用与原型相同的实例b& c。因此......当访问b原型的成员时,您真正访问a的成员(通过原型继承)。修改适用于所有继承对象

为了实现您尝试的继承,在使用Object.create并分隔所有实例时,请执行以下操作:

function a() {
  this.x = { y: 'foo' }
}

var b = Object.create(new a())
var c = Object.create(new a())

//console.log(a.x.y) // a is not an object, it's a function, or a "type"
console.log(b.x.y) // 'foo'
console.log(c.x.y) // 'foo'

b.x.y = 'bar'

var d = Object.create(new a())

//console.log(a.x.y) // a is not an object, it's a function, or a "type"
console.log(b.x.y) // 'bar'
console.log(c.x.y) // 'foo'
console.log(d.x.y) // 'foo'

答案 2 :(得分:0)

试试这个:

var a = function() {
    this.x = { y: 'foo '};
}

var b = new a();
var c = new a();

b.x.y = 'bar';

您将只引用相同的对象(指向内存中某个位置的引用指针),并修改每个对象引用的对象。您可能想要做的是创建一个孤立的新对象。