JavaScript isPrototypeOf vs instanceof用法

时间:2013-08-20 19:33:06

标签: javascript

假设我们有以下内容:

function Super() {
      // init code
}

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

Sub.prototype = new Super();

var sub = new Sub();

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

sub instanceof Super;   

Super.prototype.isPrototypeOf( sub )

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

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

5 个答案:

答案 0 :(得分:33)

想象一下,在代码中不使用构造函数,而是使用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

此处,您没有与instanceof一起使用的构造函数。您只能使用subProto.isPrototypeOf(sub)

答案 1 :(得分:10)

使用构造函数时没什么区别。 instanceof或许更清洁一点。但是当你不......时:

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

所以isPrototypeOf更为通用。

答案 2 :(得分:1)

根据此MDN Ref

  

isPrototypeOf()instanceof运算符不同。在表达式object instanceof AFunction中,对象原型链是根据AFunction.prototype而不是AFunction本身进行检查的。

答案 3 :(得分:0)

var neuesArray = Object.create(Array);

Array.isPrototypeOf(neuesArray);            // true
neuesArray instanceof Array                 // false
neuesArray instanceof Object                // true
Array.isArray(neuesArray);                  // false
Array.prototype.isPrototypeOf(neuesArray);  // false
Object.prototype.isPrototypeOf(neuesArray); // true

你了解我的朋友:) - 很简单

答案 4 :(得分:0)

只需补充@apsillers's answer

object instanceof constructor

var superProto = {}

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

console.log(superProto.isPrototypeOf(sub)); // true
console.log(sub instanceof superProto); // TypeError: Right-hand side of 'instanceof' is not callable

// helper utility to see if `o1` is
// related to (delegates to) `o2`
function isRelatedTo(o1, o2) {
  function F(){}
  F.prototype = o2;
  // ensure the right-hand side of 'instanceof' is callable
  return o1 instanceof F; 
}
isRelatedTo( b, a ); 
  

TypeError:“ instanceof”的右侧不可调用

instanceof需要右边的值可被调用,这意味着它必须是一个函数(MDN将其称为构造函数)

instanceof测试对象原型链中constructor.prototype的存在。

isPrototypeOf()没有这样的限制。 instanceof检查superProto.prototype,而isPrototypeOf()直接检查superProto