我在上一个项目中偶然发现了一个非常奇怪的问题。我已经实现了如下继承:
function Parent(){}
Parent.prototype.hi = function(){
alert("Parent: hi!");
};
Parent.prototype.bye = function(){
alert("Parent: bye!");
};
function Child(){
this.hi = function(){
alert("Child: hi!");
};
}
Child.prototype = new Parent();
这样我只能覆盖Child构造函数中需要的函数,剩下的将从父元素继承。
这没关系。这是测试:
var test = function(){
var p = new Parent();
p.hi();
p.bye();
var c = new Child();
c.hi();
c.bye();
};
test();
输出是预期的:
Parent: hi!
Parent: bye!
Child: hi!
Parent: bye!
但是,当我将实例存储在数组中时,子实例中的bye
函数不会被继承,并且会引发错误。测试代码:
var anArray = [
new Parent(),
new Child()
];
var test2 = function(){
for(var i = 0, m = null; i < anArray.length; i++){
m = anArray[i];
m.hi();
m.bye(); //WTF not working for the child?
}
};
test2();
输出:
Parent: hi!
Parent: bye!
Child: hi!
TypeError: m.bye is not a function
我花了一个多小时盯着这段代码并调试它,我无法看出问题出在哪里。原始代码更复杂,功能更多。我认为数组有问题,但我不想放弃它,因为我认为表驱动方法是我尝试实现的最佳方法。
答案 0 :(得分:2)
具有new Child
实例的数组是在Child
继承Parent
之前创建的,并且仍然具有旧原型(没有任何方法)。相反,c = new Child
在test()
分配后在Child.prototype = …
函数中执行。
将数组声明/初始化移动到test2
函数中。或者只是将所有课程内容移到顶部。