我有一个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'都使用相同的构造函数实例?或者另一个不太脆弱的解决方案.
如果我有课:
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将在所有对象上设置?
谢谢你的任何信息.
我对这一切感到有些困惑......
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构造函数不是函数?