【发布时间】:2011-09-03 02:25:39
【问题描述】:
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
来自Prototypal Inheritance in JavaScript
一段时间以来,我一直在使用这段代码来创建从以前的对象继承的新对象。但是我遇到了一个小惊喜。
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';
我确定我缺少更好的解决方案! 如何从旧对象创建新对象而不冒修改原始对象的风险?
【问题讨论】:
标签: javascript inheritance prototypal-inheritance