我有一个基类
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的孩子相同的信息?
答案 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