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';
私が見逃しているより良い解決策があると確信しています!元のオブジェクトを変更する危険を冒さずに、古いオブジェクトから新しいオブジェクトを作成するにはどうすればよいですか?