我尝试对错误进行一些简单的类型检查,并使用以下代码:
function isError(x) {
return Error.isPrototypeOf(x)
}
但是,如果我使用错误实例调用该函数,我会得到false
,如下所示:
isError(new RangeError) // false
所以我启动了节点(好吧,io.js无论如何),并执行了以下操作:
> Object.getPrototypeOf(Object.getPrototypeOf(new RangeError))
[Error]
最后,如果我使用instanceof
进行检查,它就会起作用,如下所示:
> (new RangeError) instanceof Error
true
那么,到底发生了什么?
答案 0 :(得分:7)
isPrototypeOf
和getPrototypeOf
直接查看原型链,而instanceof
查看给定构造函数的.prototype
属性。你需要使用:
function isError(x) {
return Error.prototype.isPrototypeOf(x)
}
您的函数测试x
是否继承自Error
构造函数函数对象。
答案 1 :(得分:3)
instanceof
查看指定构造函数的.prototype
属性(即[[Prototype]]
/ __proto__
)(即它还做了一些额外的工作)。
isPrototypeOf
并不起作用,并且要求您在原型链上指定要检查的确切对象实例。
Error.isPrototypeOf(r = new RangeError); // false.
false
因为函数Error
不在r
的原型链上。 r
的原型链是:
r
=> RangeError.prototype
(Error
)的实例 => Error.prototype
(Object
的实例))
此链上没有Error
构造函数,因此为false。
如果我们像这样修改你的例子:
Error.prototype.isPrototypeOf(r = new RangeError); // true.
返回true,因为.prototype
原型链上Error
函数的r
属性为。