JavaScript isPrototypeOf vs instanceof用法

use*_*498 36 javascript

假设我们有以下内容:

function Super() {
      // init code
}

function Sub() {
      Super.call(this);
      // other init code
}

Sub.prototype = new Super();

var sub = new Sub();
Run Code Online (Sandbox Code Playgroud)

然后,在我们ocde的其他部分,我们可以使用以下任一方法来检查关系:

sub instanceof Super;   
Run Code Online (Sandbox Code Playgroud)

要么

Super.prototype.isPrototypeOf( sub )
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,我们都需要同时拥有对象(sub)和父构造函数(Super).那么,你有没有理由使用其中一个?还有其他一些区别更明确的情况吗?

我已经仔细阅读了2464426,但没有找到足够具体的答案.

aps*_*ers 36

想象一下,您不在代码中使用构造函数,而是使用Object.create生成具有特定原型的对象.您的程序可能被架构为根本不使用构造函数:

var superProto = {
    // some super properties
}

var subProto = Object.create(superProto);
subProto.someProp = 5;

var sub = Object.create(subProto);

console.log(superProto.isPrototypeOf(sub));  // true
console.log(sub instanceof superProto);      // TypeError
Run Code Online (Sandbox Code Playgroud)

在这里,您没有要使用的构造函数instanceof.你只能使用subProto.isPrototypeOf(sub).

  • 感谢您的回答,我有一个快速跟进:为什么我们需要instanceof,因为isPrototypeOf似乎在所有情况下都有效?是历史还是有性能优势,还是其他什么? (2认同)
  • @ user1689498:我相信`instanceof`比较旧,看起来和Java类似,这在JavaScript首次推出时是个大问题.它也有点清洁.但是,`isPrototypeOf`是更普遍有用的. (2认同)

Sco*_*yet 11

使用构造函数时,它几乎没有什么区别. instanceof也许是一点点清洁.但是当你不......时:

var human = {mortal: true}
var socrates = Object.create(human);
human.isPrototypeOf(socrates); //=> true
socrates instanceof human; //=> ERROR!
Run Code Online (Sandbox Code Playgroud)

所以isPrototypeOf更一般.