Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
我一直在使用这段代码来创建从以前的对象继承的新对象。然而,我遇到了一个小惊喜。
a = {
foo: [1,2,3]
}
b = Object.create(a);
// b.foo -> [1,2,3]
b.foo = "test";
// b.foo -> "test"
// a.foo -> [1,2,3]
c = Object.create(a);
// c.foo -> [1,2,3]
c.foo[0] = 'test';
// c.foo -> ["test",2,3]
// a.foo -> ["test",2,3]
在尝试更改时,c.foo
我改为更改a.foo
,c.foo
显示更改,因为它继承自a
. 我现在看到的唯一解决方案是只修改以下的直接属性b
:
d = Object.create(a);
d.foo = Object.create(a.foo);
d.foo[0] = 'text';
我确定我缺少更好的解决方案!如何从旧对象创建新对象而不冒修改原始对象的风险?