奇怪的JavaScript行为 - 错误除非'类'以正确的顺序定义

时间:2014-09-15 17:53:09

标签: javascript inheritance prototype easeljs

我对javascript和画架js有一个非常奇怪的问题。

我正在使用easel.js库,并且我已经相当深入地使用它构建了一个项目。

我试图拥有一个'类'(我知道它们在技术上不是javascript中的类,但是我会使用这个术语缺少一个更好的词)从easel js继承Shape类,然后让另一个类继承那。所以它会是这样的:

easeljs.Shape - > MenuButton - > BuildingButton

我使用的代码如下所示:

BuildingButton.prototype = Object.create(MenuButton.prototype);
BuildingButton.prototype.constructor = BuildingButton;

function BuildingButton(){
    MenuButton.call(this);
}

MenuButton.prototype = Object.create(createjs.Shape.prototype);
MenuButton.prototype.constructor = MenuButton;

function MenuButton(){
    createjs.Shape.call(this);
}

问题是我的代码出现以下错误:

Uncaught TypeError: undefined is not a function 
easeljs-0.7.1.combined.js:8439

(第8439行指向Shape()构造函数中的initialize()函数。)

现在这是奇怪的事情。如果我改变定义的顺序,以便第二个而不是第一个定义子类,它可以正常工作!

MenuButton.prototype = Object.create(createjs.Shape.prototype);
MenuButton.prototype.constructor = MenuButton;

function MenuButton(){
    createjs.Shape.call(this);
}

BuildingButton.prototype = Object.create(MenuButton.prototype);
BuildingButton.prototype.constructor = BuildingButton;

function BuildingButton(){
    MenuButton.call(this);
}

这非常令人困惑,因为我似乎无法弄清楚为什么地球上会发生这种情况。我可以确保我以正确的顺序定义它们并保留它,但我将所有'类'放在不同的源文件中,然后由grunt串联起来,按字母顺序排列。 另外,我觉得我对javascript的知识可能有很大的差距(或者也许是easel.js我不确定究竟是什么导致了这种行为)。

先谢谢你的帮助,我希望这个问题有道理!

2 个答案:

答案 0 :(得分:1)

MenuButton.prototype = Object.create(createjs.Shape.prototype);
…
BuildingButton.prototype = Object.create(MenuButton.prototype);

这两个语句具有明确的依赖关系,需要以正确的顺序执行(对于函数声明,如果放在同一个范围/文件中,则顺序无关紧要,但如果在不同的文件中,则需要加载正确的顺序/文件很明显。)

  

我把所有'类'放在不同的源文件中,然后由grunt串联起来,按字母顺序排列

这不是个好主意。您应该使用一些允许声明依赖项的构建工具/脚本。

答案 1 :(得分:0)

阅读本文以清除问题:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

在第一个示例中,您尝试从无任何继承,因为尚未定义MenuButton.prototype。为了使其正常工作,只需添加MenuButton.prototype = new createjs.Shape.prototype(而不是Object.create(),不再使用它),在您使用它之前先将其实例化。你的第一个代码就像你愿意吃香蕉一样。