在使用深度 npm 依赖项的构造函数创建的对象上使用“instanceof”

2023-12-27

背景:

我有一个 npm 模块,其中有常见的错误处理代码,包括自定义错误:

function CustomError () { /* ... */ }
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
module.exports = CustomError;

我还有一些其他模块(我们称它们为'模块-a' and '模块-b')这两者都依赖于错误处理模块。

我还有一些使用 Bluebirds“过滤捕获”功能的代码:

doSomething
.catch(CustomError, () => { /* ... */ });

问题:

经过一些调试后,我发现(事后看来很明显)在'模块-a'不是由创建的错误实例'模块-b'。这是因为两个模块都有自己的 JS 文件副本,其中包含CustomError构造函数,两者都是独立运行的。

我宁愿不必诉诸我当前的解决方案,基本上是:

CustomError.isCustomError = e => e.constructor.toString() === CustomError.toString();

进而:

doSomething
.then(CustomError.isCustomError, () => { /* ... */ });

这显然是脆弱的,如果版本不同步就会崩溃。

So...

有什么方法可以确保'模块-a' and '模块-b'两者都使用相同的构造函数实例?或者另一种不太脆弱的解决方案。


这实际上也是浏览器中的一个问题,当你有一个 iframe 时,它​​会获取自己的副本,例如 Array 构造函数(使instanceof无用)。

自定义构造函数的解决方案是鸭子类型。以下是一些可能的解决方案,各有利弊。

  1. 检查构造函数名称。优点:简单,支持良好。缺点:最好选择一个相当独特的名称,以避免误报并忘记对其进行子分类。

  2. 检查对象的属性(例如,同时具有“foo”和“bar”,并且“foo”是一个函数)。优点:基本上是万无一失的。缺点:脆弱:如果您重构自定义错误类,此检查可能会随机中断,相对昂贵。

  3. (推荐)添加属性/方法。这就是许多库(例如,moment.js)处理此问题的方式。

代码示例:

CustomError.prototype._isCustomError = true;
var isCustomError = function isCustomError(obj) {
  return obj instanceof CustomError || Boolean(obj._isCustomError);
};

module.exports = {
  CustomError,
  isCustomError
};

这或多或少正是矩检测给定对象是否为矩对象的方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在使用深度 npm 依赖项的构造函数创建的对象上使用“instanceof” 的相关文章

随机推荐

  • 在 uiwebview 中播放 YouTube 视频。如何处理“完成”按钮?

    我有一个 uiwebview 可以播放 youtube 视频 我如何处理完成按钮操作 现在 当我点击 完成 按钮时 它会变回我的应用程序主菜单 而不是应该关闭的菜单 并且它会冻结 有人可以帮我吗 ps uiwebview所在的菜单 之前是模
  • GTK 中的免费对象/小部件?

    我的 GTK 应用程序中有一个包盒 我每隔一段时间就会用一个全新的条目替换它 至少现在是这样 因为我很着急 由于我要用新实例替换它 我是否需要显式地从内存中释放旧包盒内容 或者 GTK 中是否有一些垃圾收集 如果我确实需要明确需要释放对象
  • 如何创建SWIG接口文件?

    我是 SWIG 新手 而且做事的时间也少了 我正在尝试将 C 类绑定到 python 我已经在 Windows 中设置了 SWIG 并尝试运行它 成功了 我的 example i 文件就像 File example i module exa
  • 登录网站 cURL

    我是第一次使用 cURL 我需要登录一个网站 我在设置 cookie 文件和检索时遇到问题 这样我就可以访问该页面 而不仅仅是一次 而是多次 我在网上找到了代码 用于登录网站并废弃页面以获取一些详细信息 因为获取该页面需要很长时间 所以我只
  • MVP MVC 和 MVVM 之间的区别

    朋友们 我已经浏览了很多链接 博客 我发现他们中的大多数人都无法用外行语言清楚地沟通 也无法理解 MVP MVVM 和 MVC 之间的技术差异 我知道每个角色代表什么 并且也致力于 MVP 的制作 但如果有人问我同样的问题 我真的不明白 为
  • 如何在 Bokeh 绘图模块中使用 vbar 方法绘制分类条形图

    我希望在 Bokeh 绘图中使用 vbar 方法绘制条形图 其中 x 轴采用分类值而不是数值 教程页面中提供的示例 http docs bokeh org en latest docs reference plotting html htt
  • Hive-如何使用原始表中的分区“创建表作为选择..”?

    我需要从我们的 hive dlk 创建一个 工作表 虽然我可以使用 create table my table as select from dlk big table 很好 我在继承分区时遇到问题 属性day month and year
  • 使用 Photos Framework 获取相机拍摄的照片的 URL

    我有一个应用程序使用UIImagePickerController从相机和照片库中检索照片 在图像选择器委托中 我只想保存 NSURL UIImagePickerControllerReferenceURL 选取的图像以节省内存 当用户稍后
  • 使相同的 C++ 类型别名不兼容

    I use std vector
  • 如何使用存储在独立存储中的图像来制作故事板动画?

    我似乎无法将存储在独立存储中的图像显示在故事板中 当我用相机拍照时 我可以将图像输出到屏幕上 但当我使用相同的文件名时Value String Format MyImage 0 D2 jpg i 由于我存储它们的位置 如果我在故事板中再次打
  • 连接到 USB 外围设备

    看起来 UsbManager 在构建中消失了 现在我们如何与USB外设进行通信呢 像USB gt 串行等使用https github com mik3y usb serial for android https github com mik
  • 使用 cfinvoke 和 createObject 运行组件函数有什么区别?

    在我公司的代码中 我经常看到通过初始化该组件的对象并调用该对象的方法来使用组件文件 然而 在我看来 使用 cfinvoke 方法似乎更直接 特别是当仅使用组件文件中的一种方法时 这两种调用组件函数的方法有什么区别 各自的优缺点是什么 我什么
  • WPF VSTS 应用程序挂在 VS 凭据提示上

    我正在尝试编写一个使用 Visual Studio Team Service VSTS API 来显示 Visual Studio Online 中的项目的应用程序 我有以下代码 可以在控制台应用程序中完美运行 var connection
  • 在 MKSnapshot 图像中绘制带有标题的 MKPointAnnotation

    我试图绘制与 实时 MapView 中完全相同的注释 但随后在 MKSnapshot 中绘制 为什么使用 MKSnapshot gt 因为我想在 UITableView 中拥有非交互式 MapView 并且使用图像更有效 我可以使用 MKP
  • Winform自定义列表框项目

    我有一个列表框 应显示包含 2 个字段的数据 时间和消息 我希望每个项目显示为 2 行 而不是显示 1 行文本 第一行是时间 第二行是消息 其中每行都有不同的样式 我怎样才能做到这一点 我可以将对象数组绑定到列表框 但如何设置它的样式 感谢
  • Javascript 中添加的最新运算符有哪些? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道 Javascript 最近添加了哪些运算符 这包括任何可能尚未通过标准流程在所有浏览器中实现的操作符 如果或多或少确定它们会
  • 构建AWS Lambda jar

    创建 AWS Lambda jar 的标准做法是什么 我们应该将依赖项捆绑为 zip 文件中的 jar 还是应该将依赖项解压并包含为类 据我所知 这是第一个正确的选项 但是当我遵循 AWS 缩略图教程时 我想到了这个疑问 它最终创建了一个包
  • 如何使用 setAttributedText 设置 WKInterface 标签的对齐方式

    我正在尝试设置对齐方式WKInterfaceLabel using setAttributedText功能 这是我的代码 var paragraphStyle NSParagraphStyle defaultParagraphStyle p
  • 在 Swift 中运行时更改自动布局约束的 UIView 框架

    例如 我使用此代码来更改UIView called Propo self Propo frame origin x self view frame width Propo故事板有限制 但是当应用程序视图消失并重新出现时 UIView将自身重
  • 在使用深度 npm 依赖项的构造函数创建的对象上使用“instanceof”

    背景 我有一个 npm 模块 其中有常见的错误处理代码 包括自定义错误 function CustomError CustomError prototype Object create Error prototype CustomError