我有一个类和另一个继承第一个属性的子类。
function A() {}
A.prototype.children = [];
function B() {}
B.prototype = new A();
B.prototype.addChild = function(Child) {
this.children.push(Child);
};
var b = new B();
b.addChild(new Object());
奇怪的是,在将b
转储到控制台时,.children
中没有项目(如果属性.children
完全存在; Chrome / Firefox),但其原型为.children
财产得到填充。 为什么?
答案 0 :(得分:1)
您不应该使用原型来存储实例的数据。 当你这样做。孩子们,B中没有孩子,因此原型链继续到A. 正如@Bergi建议的那样,你应该删除:
B.prototype = new A
尝试定义:
function A() {
this.children = [];
}
A.prototype.addChild = function (o) { this.children.push(o)};
var b = new A();
b.addChild({});
答案 1 :(得分:1)
在您的脚本中只创建了一个子数组,但由于继承,每个实例(甚至是B的原型)都会引用它。当你推动它时,你也会看到来自世界各地的变化。
相反,为每个实例提供自己的数组:
function A() {
this.children = [];
}
另外,不要只为all B instances to inherit from with new A
创建一个数组 - 而是使用
function B() {
A.call(this); // do everything the A constructor does on this instance
}
B.prototype = Object.create(A.prototype);
B.prototype.addChild = function(Child) {
this.children.push(Child);
};