簡體   English   中英

JavaScript的instanceof運算符如何工作?

[英]How does JavaScript's instanceof operator work?

在使用Foo.prototype = Object.create(Bar.prototype)創建繼承鏈之后,JavaScript的instanceof使用哪些屬性來確定對象是特定類的實例?

例如:

var Fruit = function() {};

var Banana = function() {};
Banana.prototype = Object.create(Fruit.prototype);

var YellowBanana = function() {};
YellowBanana.prototype = Object.create(Banana.prototype);

console.log((new Fruit) instanceof Fruit); // true
console.log((new Banana) instanceof Fruit); // true
console.log((new YellowBanana) instanceof Banana); // true
console.log((new YellowBanana) instanceof Fruit); // true

如果我們將表達式布置為object instanceof constructor方法的object instanceof constructor則它將檢查一下是否constructor.prototypeobject的原型中。

資料來源: MDN

等同於instanceof運算符的功能可以用純Java語言實現,如下所示:

function instance_of(obj, constructor) {
  var o = obj, prot=constructor.prototype;
  while(o != null && o !== Object) {
    o = Object.getPrototypeOf(o);
    if(o === prot) return true;
  }
  return false;
}

它使用ES5函數Object.getPrototypeOf()來訪問給定對象實例的原型。 所有現代瀏覽器和javascript環境都支持getPrototypeOf 大多數較舊的瀏覽器都依靠__proto__屬性(現已棄用/不推薦使用)來提供對相同信息的訪問。

這些都返回true的原因是因為它們具有要檢查的指定函數的原型

當你做

Instance instanceof TheFunction

它將查看Instance所有prototype ,並檢查TheFunction.prototype是否在其中

從Mozilla:

instanceof運算符用於測試對象的原型鏈中是否具有構造函數的prototype屬性。

當然是原型。 原型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM