小编phe*_*nal的帖子

对使用深度npm依赖项的构造函数创建的对象使用`instanceof`

背景:

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

function CustomError () { /* ... */ }
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
module.exports = CustomError;
Run Code Online (Sandbox Code Playgroud)

我有一些其他模块(我们称之为'module-a''module-b'),它们都依赖于错误处理模块.

我也有一些使用Bluebirds"过滤捕获"功能的代码:

doSomething
.catch(CustomError, () => { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

CustomError.isCustomError = e => e.constructor.toString() === CustomError.toString();
Run Code Online (Sandbox Code Playgroud)

然后:

doSomething
.then(CustomError.isCustomError, () => { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

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

所以...

有没有办法确保'module-a''module-b'都使用相同的构造函数实例?或者另一个不太脆弱的解决方案.

javascript node.js npm

15
推荐指数
2
解决办法
513
查看次数

CoffeeScript:使用instanceof vs Class.constructor.name

如果我有课:

class Haha
  constructor: (@lolAmount = 1) ->
    alert @lolAmount
Run Code Online (Sandbox Code Playgroud)

我想检查对象是否属于正确的类,使用它总是安全的constructor.name:

haha = new Haha()
unless haha.constructor.name is 'Haha'
  throw Error 'Wrong type'
Run Code Online (Sandbox Code Playgroud)

或者它是否更好用instanceof:

haha = new Haha()
unless haha instanceof Haha
  throw Error 'Wrong type'
Run Code Online (Sandbox Code Playgroud)

我有一个论点instanceof是使用时extends:

class BigHaha extends Haha

bigHaha = new BigHaha
console.log bigHaha instanceof Haha #true
Run Code Online (Sandbox Code Playgroud)

但是作为一个JavaScript运算符是多么安全 - 我觉得我应该对它持怀疑态度.

另一方面,constructor.name很明显发生了什么.是否保证constructor.name将在所有对象上设置?

谢谢你的任何信息.

coffeescript

12
推荐指数
1
解决办法
8914
查看次数

什么类型的对象是JavaScript中的"Worker"

我对这一切感到有些困惑......

Chrome和Firefox都告诉我不同​​的东西,我找不到提到它的规范中的任何部分,但是:

在Chrome中:

Object instanceof Function // true
Function instanceof Object // true
Worker instanceof Object // true
Worker instanceof Function // false <- WTF???
Run Code Online (Sandbox Code Playgroud)

在FireFox中:

Object instanceof Function // true
Function instanceof Object // true
Worker instanceof Object // false
Worker instanceof Function // false
Run Code Online (Sandbox Code Playgroud)

当然,初始化的新Worker()既是Worker又是Object,但为什么Worker构造函数不是函数?

javascript web-worker

5
推荐指数
1
解决办法
609
查看次数

标签 统计

javascript ×2

coffeescript ×1

node.js ×1

npm ×1

web-worker ×1