在PathFinding.js仓库中自定义添加IDDFS寻路器后出现构造函数类型错误的求助
看起来你已经为PathFinding.js添加IDDFS寻路器做了不少准备工作,但遇到了构造函数找不到的报错,我来帮你排查一下可能的原因和解决办法:
你的问题核心是:在fork的PathFinding.js中新增了IDDFSFinder寻路器,完成了代码导出、UI配置逻辑的添加后,点击「Start Search」时出现Uncaught TypeError: PF.IDDFSFinder is not a constructor错误。
可能的问题点及解决步骤
1. 项目未重新构建,浏览器加载的仍是旧版本库文件
PathFinding.js的src目录是源码,通常需要通过构建工具(比如browserify、webpack)打包成浏览器可直接使用的全局PF对象。你修改了src/PathFinding.js添加了导出,但如果没有重新构建,浏览器加载的dist目录下的旧库文件里根本没有IDDFSFinder的定义。
解决办法:
- 打开项目根目录的
package.json,查看scripts字段里的构建命令,通常是类似"build": "browserify src/PathFinding.js -s PF -o dist/pathfinding.js"这样的配置。 - 在终端执行构建命令,比如
npm run build,重新生成dist目录下的库文件。 - 确保visual/index.html中引用的是dist目录下最新构建的
pathfinding.js,可以在浏览器开发者工具的Network面板中查看该文件的内容,确认是否包含IDDFSFinder的定义。
2. IDDFSFinder模块未正确导出
你提供的IDDFSFinder代码片段里,没有看到模块导出的语句。如果src/finders/IDDFSFinder.js没有正确导出构造函数,那么src/PathFinding.js中require('./finders/IDDFSFinder')拿到的就是undefined,自然无法作为构造函数使用。
解决办法:
- 打开
src/finders/IDDFSFinder.js,在文件末尾添加导出语句:module.exports = IDDFSFinder; - 然后重新执行项目构建命令,确保导出的构造函数被打包到全局PF对象中。
3. 拼写或大小写不一致
检查所有涉及IDDFSFinder的地方,确保拼写和大小写完全一致:
- src/PathFinding.js中的导出键名
'IDDFSFinder' - 你的寻路器文件名
IDDFSFinder.js - panel.js中的
new PF.IDDFSFinder - UI代码中的
iddfs_header、iddfs_section等标识
如果有任何一处拼写错误(比如写成IDDFSfinder或IddfsFinder),都会导致构造函数无法被正确识别。
4. 额外的UI代码小问题(非当前错误原因,但后续需修正)
你的panel.js中选择器写法有问题:
allowDiagonal = typeof $('#iddfs_section ' + '.allow_diagonal:checked').val() !== 'undefined';
这里的字符串拼接会生成#iddfs_section .allow_diagonal:checked(两个空格),虽然可能不影响选择,但更规范的写法是:
allowDiagonal = $('#iddfs_section .allow_diagonal').is(':checked'); biDirectional = $('#iddfs_section .bi-directional').is(':checked'); dontCrossCorners = $('#iddfs_section .dont_cross_corners').is(':checked');
用.is(':checked')来判断复选框状态会更准确简洁。
排查顺序建议
先检查IDDFSFinder.js的导出语句,再重新构建项目,最后验证构建后的库文件是否包含IDDFSFinder,这三个步骤解决构造函数找不到问题的概率最高。
内容来源于stack exchange

