B扩展了A,但B.add填充了A.prototype.property
B extends A, but B.add populates A.prototype.property
我有一个类和另一个类从第一个继承属性子。
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
属性被填充。为什么呢?
在脚本中只创建了一个子数组,但由于继承,它被每个实例(甚至B的原型)引用。当你推到它时,你也会看到来自各处的更改。
相反,给每个实例一个自己的数组:
function A() {
this.children = [];
}
并且,不要为所有B实例创建一个数组来继承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);
};
您不应该使用原型来存储属于实例的数据。当你这样做的时候。如果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({});
相关文章:
- $(this).prop('property') vs. this.property
- 直接在函数声明上使用function.prototype.bind
- 如何迭代Array.prototype函数
- 为什么JavaScript可以'找不到给定的InnerHTML并返回Cannot set property
- Object.prototype using 'this'
- 在不兼容的接收器上调用的方法Set.prototype.add未定义
- 为什么可以't我用Set对象调用Array.prototype.map
- ExtJS 4 Object.prototype fail
- 如何通过Prototype或jquery移除子类的父类基类
- 复选框:使用Array.prototype.forEach调用推送选中订单,
- 将setTimeout()包装器实现为Element.prototype中的方法
- Object.prototype.hasOwnProperty.call() vs Object.prototype.h
- 出现了" Cannot read property 'prototype'undefined"
- ConstructorFunc.property vs ConstructorFunc.prototype.proper
- highcharts canvas-tools:无法读取property 'prototype'的定义
- 无法读取property 'prototype'Nodejs中未定义的
- B扩展了A,但B.add填充了A.prototype.property
- JavaScript prototype property and prototype link
- karma: TypeError: Cannot read property 'prototype' o
- Express -未捕获的TypeError: Cannot read property 'prototype&