isPrototypeOf说不,但是instanceof说是 - 那是怎么回事?

时间:2015-01-31 16:16:14

标签: javascript

我尝试对错误进行一些简单的类型检查,并使用以下代码:

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

那么,到底发生了什么?

2 个答案:

答案 0 :(得分:7)

isPrototypeOfgetPrototypeOf直接查看原型链,而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.prototypeError)的实例 => Error.prototypeObject实例))

此链上没有Error构造函数,因此为false。

如果我们像这样修改你的例子:

Error.prototype.isPrototypeOf(r = new RangeError); // true.

返回true,因为.prototype原型链上Error函数r属性为