为什么这个javascript继承导致共享数组的引用?

时间:2013-06-23 23:13:05

标签: javascript oop prototype

我有一个基类

function Base(){
    this.children = new Array();
}
Base.prototype.Add = function(child){
    this.children.push(child)
}

function Sub1(){...}
Sub1.prototype = new Base();

function Sub2(){...}
Sub2.prototype = new Base();

所以我怎么做

var S1_1 = new Sub1();
var S1_2 = new Sub1();
S1_1.Add(new Sub2());

S1_2由于某种原因也有1个孩子并且包含与我添加到S1_1的孩子相同的信息?

2 个答案:

答案 0 :(得分:6)

这是因为原型继承的工作原理。您的所有Sub1对象都从公共Base对象继承。由于Base对象包含数组,因此所有Sub1实例共享该数组。

换句话说,当您要求每个.children对象的Sub1属性时,他们会看到他们没有这样的属性,因此会在原型上查找它他们继承了。由于它们继承自相同的原型对象,因此它们使用相同的数组。


为每个Sub1拥有自己的数组,您应该在Sub1构造函数中定义它。

function Base(){
    this.children = new Array();
}
Base.prototype.Add = function(child){
    this.children.push(child); // `this` will be whatever object invoked the method
}

function Sub1(){
    this.children = [];
}
Sub1.prototype = new Base();

function Sub2(){
    this.children = [];
}
Sub2.prototype = new Base();

答案 1 :(得分:0)

创建子时,您没有使用ownership定义的基本变量的this /副本,您可以这样做:

function Sub1(){
  Base.call(this);
}

该代码所做的是使用Sub1实例作为this上下文调用Base。

有关原型行为的更多信息,请访问:Prototypical inheritance - writing up