我想在对象内部更改对象的属性。但是,当我这样做时,使用相同原型创建的其他对象属性也发生了变化。
代码如下:
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
。任何人都可以解释这里发生了什么,也许可以参考和建议解决方法吗?
答案 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';
您将只引用相同的对象(指向内存中某个位置的引用指针),并修改每个对象引用的对象。您可能想要做的是创建一个孤立的新对象。