不同依赖版本下instanceof运算符返回false的原因排查
问题原因:重复安装的
external-lib导致类实例判断失效 核心问题是你的项目里同时存在external-lib@1.0.0和external-lib@2.0.0两个独立的包副本——哪怕HttpException的代码完全没改,这两个版本里的HttpException在JS运行环境中是完全独立的构造函数,直接导致instanceof判断失效。
具体细节:
- 当你升级
my-server的external-lib到2.0.0后,npm会在my-server的依赖目录下安装2.0.0版本;而my-lib依赖的1.0.0版本会被单独安装(可能在my-lib/node_modules或者项目根目录的node_modules里,取决于npm版本和依赖解析规则)。 my-server抛出的HttpException实例,是由2.0.0版本的构造函数创建的;但my-lib里导入的HttpException是1.0.0版本的构造函数。- JavaScript的
instanceof判断依赖原型链:只有实例的原型链上存在构造函数的prototype属性时才返回true。两个版本的HttpException虽然代码一致,但它们的prototype是不同的对象,所以captured instanceof HttpException会返回false。
你可以通过以下方式验证:
- 在
my-server和my-lib中分别打印import('external-lib').HttpException的toString()结果,会看到它们指向不同的模块路径。 - 执行
npm ls external-lib查看项目依赖树,能清晰看到两个版本同时存在。
内容的提问来源于stack exchange,提问作者Rusty Gold
相关产品推荐
相关产品推荐

