2

我有一个基类

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 的孩子相同的信息?

4

2 回答 2

6

这是因为这就是原型继承的工作方式。您的所有Sub1对象都继承自一个公共Base对象。因为Base对象持有数组,所以所有Sub1实例共享该数组。

换句话说,当您询问.children每个Sub1对象的属性时,他们会看到他们不拥有这样的属性,因此会在他们继承的原型上查找它。由于它们继承自同一个原型对象,因此它们使用相同的 Array。


对于每个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();
于 2013-06-23T23:17:47.850 回答
0

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

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

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

有关原型行为的更多信息,请参见:原型继承 - 编写

于 2013-06-23T23:48:25.997 回答