instanceof

instanceof

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

用法


boolean result = object instanceof class

語法


object instanceof constructor
參數
● object
● 要檢測的對象.
● constructor
● 某個構造函數
描述
instanceof運算符用來檢測constructor.prototype是否存在於參數object的原型鏈上。
1
2
3
4
5
6
7
8
9
10
11
12
13
// 定義構造函數
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了。

多全局對象


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

參數


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

說明


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

示例


舉個例子:
String s = "I AM an Object!";
boolean isobject = s instanceof Object;
我們聲明了一個String對象引用,指向一個String對象,然後用instanceof來測試它所指向的對象是否是Object類的一個實例,顯然,這是真的,所以返回true,也就是isobject的值為true。
instanceof有一些用處。比如我們寫了一個處理賬單的系統,其中有這樣三個類:
public class Bill {//省略細節}
public class PhoneBill extends Bill {//省略細節}
public class GasBill extends Bill {//省略細節}
在處理程序里有一個方法,接受一個Bill類型的對象,計算金額。假設兩種賬單計算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//計算電話賬單
}
if (bill instanceof GasBill) {
//計算燃氣賬單
}
...
}
這樣就可以用一個方法處理兩種子類。
然而,這種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象編程應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了:
public double calculate(PhoneBill bill) {
//計算電話賬單
}
public double calculate(GasBill bill) {
//計算燃氣賬單
}
所以,使用instanceof在絕大多數情況下並不是推薦的做法,應當好好利用多態
instanceof 一般情況下 用在對象類型的強制轉換,
例如:
繼承關係 class Manager extends Employee
----------------------------------------------------------
public void doSomething(Employee e) {
if ( e instanceof Manager){
Manager m = (Manager) e ;
}
}
網路釋義
1.運算符返回一個 Boolean 值,表明某個對象是否為特定類的一個實例。...instanceof 運算符...返回一個 Boolean 值,表明某個給定的數是否是有窮的。
2. 和回調概念 instanceof和回調概念...instanceof和回調概念...
3. 動態的
4. 操作符
-----------------------------------------------------------