39

假设我们有以下内容:

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,但没有找到足够具体的答案。

4

5 回答 5

43

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

于 2013-08-20T19:41:29.863 回答
14

使用构造函数时几乎没有区别。 instanceof也许更干净一些。但是当你不...:

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

所以isPrototypeOf更一般。

于 2013-08-20T19:50:08.360 回答
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

你明白我的朋友吗:) - 很简单

于 2014-09-21T11:17:50.860 回答
0

根据这个MDN 参考

isPrototypeOf()不同于instanceof运营商。在表达式object instanceof AFunction中,对象原型链是针对AFunction.prototype而不是针对AFunction自身进行检查的。

于 2018-10-03T05:21:20.040 回答
0

只需补充@apsillers 的答案

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

于 2018-11-23T06:24:06.143 回答