gpt4 book ai didi

javascript - 当实例存储在数组中时,原型(prototype)继承不起作用

转载 作者:行者123 更新时间:2023-11-29 21:59:38 25 4
gpt4 key购买 nike

我在上一个项目中偶然发现了一个非常奇怪的问题。我按如下方式实现了继承:

    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 here

我盯着这段代码调试了一个多小时,也看不出问题出在哪里。原来的代码要复杂得多,功能也更多。我认为数组有问题,但我不想放弃它,因为我认为表驱动方法是我要实现的最佳方法。

最佳答案

包含 new Child 实例的数组是在您让 ChildParent 继承之前创建的,并且仍然具有旧原型(prototype)(没有任何方法)。相比之下,c = new ChildChild.prototype = … 赋值后在 test() 函数中执行。

将数组声明/初始化移动到 test2 函数中。或者干脆将所有类(class)内容移至顶部。

关于javascript - 当实例存储在数组中时,原型(prototype)继承不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com