isPrototypeOf说不,但是instanceof说是 - 发生了什么事?

Mar*_*ade 2 javascript

我尝试做一些简单的类型检查错误,并有以下代码:

function isError(x) {
  return Error.isPrototypeOf(x)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我用一个错误实例调用该函数,我会false这样:

isError(new RangeError) // false
Run Code Online (Sandbox Code Playgroud)

所以我启动了节点(好吧,io.js),并做了以下事情:

> Object.getPrototypeOf(Object.getPrototypeOf(new RangeError))
[Error]
Run Code Online (Sandbox Code Playgroud)

最后,如果我进行检查instanceof,它的工作原理如下:

> (new RangeError) instanceof Error
true
Run Code Online (Sandbox Code Playgroud)

那么,到底发生了什么?

Ber*_*rgi 7

isPrototypeOfgetPrototypeOf直接查看原型链,同时instanceof查看.prototype给定构造函数的属性.你需要使用:

function isError(x) {
  return Error.prototype.isPrototypeOf(x)
}
Run Code Online (Sandbox Code Playgroud)

您的函数测试是否x继承自Error构造函数对象.

  • `Object.getPrototypeOf(new Error()).isPrototypeOf(new RangeError)`返回true,你必须要理解构造函数的prototype属性和实例的原型之间的区别,通常是`__proto__` (2认同)
  • 也就是说,`Object.getPrototypeOf(Error)`是`Function.prototype`,因为你要求一个函数的原型(构造函数) (2认同)