javascript中的递归原型继承?

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)

来自JavaScript中的Prototypal继承

我一直在使用这段代码来创建从以前的代码继承的新对象.但是我遇到了一点意外.

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)

我相信我错过了一个更好的解决方案!如何从旧对象创建新对象而不会有修改原始文件的风险?

bea*_*mit 1

+1 引用 Crockford =D

我认为数组总是通过引用传递,并且数组永远不会被复制。我认为 Array.slice 会复制它,但这是一个边缘情况......

create函数主要用于复制函数等。我从不使用该方法,因为我只是创建一个构造函数:

function a() {
    this.foo = [0, 1, 2];
}
Run Code Online (Sandbox Code Playgroud)

这样,每次调用您都会得到一个新的数组。只需执行 b = new a(); 这个对我有用...

我尽量避免继承,因为它总是存在问题。我只会使用构造函数,然后为其分配新变量(而不是原型)。不过,多重继承变得很棘手......