B扩展A,但B.add填充A.prototype.property

时间:2013-03-27 01:43:16

标签: javascript javascript-objects

我有一个类和另一个继承第一个属性的子类。

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财产得到填充。 为什么?

2 个答案:

答案 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);
};