複製鏈接
請複製以下鏈接發送給好友

instanceof

鎖定
instanceof是Javaphp的一個二元操作符(運算符),和==,>,<是同一類東西。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回boolean類型的數據。可以用來判斷繼承中的子類的實例是否為父類的實現。相當於c#中的is操作符。java中的instanceof是通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。
中文名
實例
定    義
是Java、php的一個二元操作符
同    類
==,>,
俗    稱
Java的保留關鍵字

instanceof用法

boolean result = object instanceof class

instanceof參數

Result:布爾類型
Object:必選項。任意對象表達式。
class:必選項。任意已定義的對象類。

instanceof説明

如果 object 是 class 的一個實例,則 instanceof 運算符返回 true。如果 object 不是指定類的一個實例,或者 object 是 null,則返回 false。

instanceof語法

object instanceof constructor

instanceof參數

  • object
  • 要檢測的對象.
  • constructor
  • 某個構造函數

instanceof描述

instanceof運算符用來檢測constructor.prototype是否存在於參數object的原型鏈上。
// 定義構造函數
function C(){} 
function D(){} 
var o = new C();
o instanceof C; // true,因為 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因為 D.prototype不在o的原型鏈上
o instanceof Object; // true,因為Object.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上
C.prototype = {};var o2 = new C();
o2 instanceof C; // trueo instanceof 
C; // false,C.prototype指向了一個空對象,這個空對象不在o的原型鏈上.
D.prototype = new C(); // 繼承var o3 = new D();
o3 instanceof D; // trueo3 instanceof C; // true 因為C.prototype現在在o3的原型鏈上
需要注意的是,如果表達式obj instanceof Foo返回true,則並不意味着該表達式會永遠返回true,因為Foo.prototype屬性的值有可能會改變,改變之後的值很有可能不存在於obj的原型鏈上,這時原表達式的值就會成為false。另外一種情況下,原表達式的值也會改變,就是改變對象obj的原型鏈的情況,雖然在ES規範中,我們只能讀取對象的原型而不能改變它,但藉助於非標準的__proto__偽屬性,是可以實現的。比如執行obj.__proto__ = {}之後,obj instanceof Foo就會返回false了。

instanceofinstanceof和多全局對象

在瀏覽器中,我們的腳本可能需要在多個窗口之間進行交互。多個窗口意味着多個全局環境,不同的全局環境擁有不同的全局對象,從而擁有不同的內置類型構造函數。這可能會引發一些問題。比如,表達式[] instanceof window.frames[0].Array會返回false,因為Array.prototype !== window.frames[0].Array.prototype,並且數組從前者繼承 [1] 
起初,你會認為這樣並沒有意義,但是當你在你的腳本中開始處理多個frame或多個window以及通過函數將對象從一個窗口傳到另一個窗口時,這就是一個有效而強大的話題。比如,實際上你可以通過使用Array.isArray(myObj)或者Object.prototype.toString.call(myObj) === "[object Array]"來安全的檢測傳過來的對象是否是一個數組。
比如檢測一個Nodes在另一個窗口中是不是SVGElement,你可以使用myNode instanceof myNode.ownerDocument.defaultView.SVGElement。

instanceof示例

1.演示String對象和Date對象都屬於Object類型和一些特殊情況節
下面的代碼使用了instanceof來證明:String和Date對象同時也屬於Object類型(他們是由Object類派生出來的)。
但是,使用對象文字符號創建的對象在這裏是一個例外:雖然原型未定義,但instanceof Object返回true。
var simpleStr = "This is a simple string"; var myString  = new String();var newStr    = new String("String created with constructor");var myDate    = new Date();var myObj     = {};var myNonObj  = Object.create(null);simpleStr instanceof String; // 返回 false, 檢查原型鏈會找到 undefinedmyString  instanceof String; // 返回 truenewStr    instanceof String; // 返回 truemyString  instanceof Object; // 返回 truemyObj instanceof Object;    // 返回 true, 儘管原型沒有定義({})  instanceof Object;    // 返回 true, 同上myNonObj instanceof Object; // 返回 false, 一種創建非 Object 實例的對象的方法myString instanceof Date; //返回 falsemyDate instanceof Date;     // 返回 truemyDate instanceof Object;   // 返回 truemyDate instanceof String;   // 返回 false
2.演示mycar屬於Car類型的同時又屬於Object類型
下面的代碼創建了一個類型Car,以及該類型的對象實例mycar.instanceof運算符表明了這個mycar對象既屬於Car類型,又屬於Object類型。
function Car(make, model, year) {  this.make = make;  this.model = model;  this.year = year;}var mycar = new Car("Honda", "Accord", 1998);var a = mycar instanceof Car;   
 // 返回 truevar b = mycar instanceof Object; // 返回 true
3.不屬於某實例
要測試對象是否不是某特定構造函數的實例,你可以這樣做
if (!(mycar instanceof Car)) {  // Do something, like mycar = new Car(mycar)}
這和以下代碼完全不同
if (!mycar instanceof Car)
這段代碼永遠會得到false(!mycar將在instanceof之前被處理,所以你總是在驗證一個布爾值是否是Car的一個實例)。
參考資料
  • 1.    Babloyantz A , Destexhe A . Low-dimensional chaos in an instance of epilepsy.[J]. Proceedings of the National Academy of Sciences, 1986, 83(10):3513-3517.