51

私自身の古いコードの一部では、次のコードを使用しています。

Object.prototype.instanceOf = function( iface )
{
 return iface.prototype.isPrototypeOf( this );
};

それから私は(例えば)

[].instanceOf( Array )

これは機能しますが、次のようにすると同じようになります。

[] instanceof Array

確かに、これは非常に単純な例にすぎません。したがって、私の質問は次のとおりです。

a instanceof b ALWAYSは と同じですかb.prototype.isPrototypeOf(a)?

4

3 に答える 3

31

はい、どちらも同じことを行います。どちらもプロトタイプチェーンをトラバースして、その中の特定のオブジェクトを探します。

両方の違いは、それらが何であるか、およびそれらをどのように使用するかです。たとえば、isPrototypeOfはオブジェクトで使用可能な関数です。このメソッドはで定義されているため、特定のオブジェクトが別のオブジェクトのプロトタイプチェーンにあるObject.prototypeかどうかをテストできます。すべてのオブジェクトで使用できます。Object.prototype

instanceof演算子であり、オブジェクトとコンストラクター関数の2つのオペランドが必要です。渡された関数prototypeプロパティがオブジェクトのチェーンに存在するかどうかをテストします([[HasInstance]](V)内部操作を介して、関数オブジェクトでのみ使用可能)。

例えば:

function A () {
  this.a = 1;
}
function B () {
  this.b = 2;
}
B.prototype = new A();
B.prototype.constructor = B;

function C () {
  this.c = 3;
}
C.prototype = new B();
C.prototype.constructor = C;

var c = new C();

// instanceof expects a constructor function

c instanceof A; // true
c instanceof B; // true
c instanceof C; // true

// isPrototypeOf, can be used on any object
A.prototype.isPrototypeOf(c); // true
B.prototype.isPrototypeOf(c); // true
C.prototype.isPrototypeOf(c); // true
于 2010-03-17T18:22:34.867 に答える
2

一方は式で、もう一方はメソッド呼び出しであるため、演算子の優先順位と真偽は異なります。強調すべきことの 1 つは、両方ともプロトタイプ チェーンをトラバースすることです。そのため、一致するプロトタイプと問題のオブジェクトの間に 1 対 1 のマッピングがあると想定することはできません。

var i = 0;

function foo()
{
console.log("foo");
console.log(i++ + ": " + Object.prototype.isPrototypeOf(Object) ) //true
console.log(i++ + ": " + Function.prototype.isPrototypeOf(Function) ) //true

console.log(i++ + ": " + Function.prototype.isPrototypeOf(Function) ) //true
console.log(i++ + ": " + Function.prototype.isPrototypeOf(Object) ) //true

console.log(i++ + ": " + RegExp.prototype.isPrototypeOf( RegExp(/foo/) ) ) //true
console.log(i++ + ": " + Object.prototype.isPrototypeOf( RegExp(/foo/) ) ) //true
console.log(i++ + ": " + Function.prototype.isPrototypeOf( RegExp(/foo/) ) ) //false
console.log(i++ + ": " + Object.prototype.isPrototypeOf(Math) ) //true
console.log(i++ + ": " + Math.isPrototypeOf(Math) ) //false
}

function bar()
{
console.log("bar");
console.log(i++ + ": " + (Object instanceof Object) ) //true

console.log(i++ + ": " + (Function instanceof Function) ) //true
console.log(i++ + ": " + (Function instanceof Object) ) //true

console.log(i++ + ": " + (RegExp(/foo/) instanceof RegExp) ) //true
console.log(i++ + ": " + (RegExp(/foo/) instanceof Object)  ) //true
console.log(i++ + ": " + (RegExp(/foo/) instanceof Function) ) //false
console.log(i++ + ": " + (Math instanceof Object) ) //true
console.log(i++ + ": " + (Math instanceof Math) ) //error
}
try
  {
  foo()
  }
catch(e)
  {
  console.log(JSON.stringify(e));
  }
finally
  {
  try
    {
    bar();
    }
  catch(e)
    {
    console.log(JSON.stringify(e));
    }
  }

参考文献

于 2013-11-19T23:51:44.473 に答える