Ann*_*nan 9 javascript inheritance prototypal-inheritance
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
Run Code Online (Sandbox Code Playgroud)
我一直在使用这段代码来创建从以前的代码继承的新对象.但是我遇到了一点意外.
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]
Run Code Online (Sandbox Code Playgroud)
在尝试改变时,c.foo我改变了a.foo,c.foo显示了改变,因为它继承了a.我现在看到的唯一解决方案是仅修改以下的直接属性b:
d = Object.create(a);
d.foo = Object.create(a.foo);
d.foo[0] = 'text';
Run Code Online (Sandbox Code Playgroud)
我相信我错过了一个更好的解决方案!如何从旧对象创建新对象而不会有修改原始文件的风险?
+1 引用 Crockford =D
我认为数组总是通过引用传递,并且数组永远不会被复制。我认为 Array.slice 会复制它,但这是一个边缘情况......
create函数主要用于复制函数等。我从不使用该方法,因为我只是创建一个构造函数:
function a() {
this.foo = [0, 1, 2];
}
Run Code Online (Sandbox Code Playgroud)
这样,每次调用您都会得到一个新的数组。只需执行 b = new a(); 这个对我有用...
我尽量避免继承,因为它总是存在问题。我只会使用构造函数,然后为其分配新变量(而不是原型)。不过,多重继承变得很棘手......
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |