当实例存储在数组中时,原型继承不起作用
Prototypal Inheritance Not Working When Instances Are Stored In An Array
我在上一个项目中偶然发现了一个非常奇怪的问题。我已经实现了继承如下:
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();
通过这种方式,我可以只覆盖我在子构造函数中需要的函数,其余的将从父构造函数继承。
这个工作正常。下面是测试:
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
JSFiddle这里
我花了一个多小时盯着这段代码并调试它,但我看不出问题在哪里。最初的代码要复杂得多,功能也更多。我认为数组有问题,但我不想放弃它,因为我认为表驱动的方法是我想实现的最好的方法。
具有new Child
实例的数组是在您让Child
继承Parent
之前创建的,并且仍然具有旧的原型(没有任何方法)。相比之下,c = new Child
在Child.prototype = …
赋值之后在test()
函数中执行。
将数组声明/初始化移动到test2
函数中。或者干脆把所有类的东西都移到上面。
相关文章:
- 如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
- $emit,$broadcast,原型继承
- 原型继承未按预期工作
- JavaScript中的原型继承.我可以称之为“超级”等价物吗?
- 不创建父对象的原型继承
- Javascript基本继承与Crockford原型继承
- JavaScript-构造函数参数和原型继承
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- 原型继承返回值
- 如何进行JavaScript原型继承(原型链)
- Javascript-经理是一个人,但不是经理本身?功能/原型继承
- 模块化JS和原型继承
- 理解经典继承和原型继承之间的区别
- 理解Javascript原型继承
- AngularJS:多个工厂实例任何原型继承
- Javascript原型继承原型函数调用
- JavaScript中的原型继承是否演示了类型多态性
- 在JavaScript中使用带有原型继承的InstanceOf
- 原型继承和原型属性
- JavaScript-原型继承