当实例存储在数组中时,原型继承不起作用

时间:2014-07-02 15:36:45

标签: javascript arrays inheritance prototypal-inheritance

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

    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

JSFiddle here

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

1 个答案:

答案 0 :(得分:2)

具有new Child实例的数组是在Child继承Parent之前创建的,并且仍然具有旧原型(没有任何方法)。相反,c = new Childtest()分配后在Child.prototype = …函数中执行。

将数组声明/初始化移动到test2函数中。或者只是将所有课程内容移到顶部。