-
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的一個實例)。