国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

實例講解JavaScript中instanceof運算符的用法

2019-11-20 09:44:53
字體:
來源:轉載
供稿:網友

instanceof 運算符簡介

在 JavaScript 中,判斷一個變量的類型嘗嘗會用 typeof 運算符,在使用 typeof 運算符時采用引用類型存儲值會出現一個問題,無論引用的是什么類型的對象,它都返回 “object”。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符相似,用于識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發者明確地確認對象為某特定類型。例如:

清單 1. instanceof 示例

 var oStringObject = new String("hello world");  console.log(oStringObject instanceof String); // 輸出 "true"

這段代碼問的是“變量 oStringObject 是否為 String 對象的實例?”oStringObject 的確是 String 對象的實例,因此結果是”true”。盡管不像 typeof 方法那樣靈活,但是在 typeof 方法返回 “object” 的情況下,instanceof 方法還是很有用的。

instanceof 運算符的常規用法:

通常來講,使用 instanceof 就是判斷一個實例是否屬于某種類型。例如:

清單 2. instanceof 常規用法

 // 判斷 foo 是否是 Foo 類的實例 function Foo(){}  var foo = new Foo();  console.log(foo instanceof Foo)//true

另外,更重的一點是 instanceof 可以在繼承關系中用來判斷一個實例是否屬于它的父類型。例如:

清單 3. instanceof 在繼承中關系中的用法

 // 判斷 foo 是否是 Foo 類的實例 , 并且是否是其父類型的實例 function Aoo(){}  function Foo(){}  Foo.prototype = new Aoo();//JavaScript 原型繼承  var foo = new Foo();  console.log(foo instanceof Foo)//true  console.log(foo instanceof Aoo)//true

上面的代碼中是判斷了一層繼承關系中的父類,在多層繼承關系中,instanceof 運算符同樣適用。

你真的了解 instanceof 操作符嗎?

看了上面的代碼示例,是不是覺得 instanceof 操作符很簡單,下面來看點復雜的用法。

清單 4. instanceof 復雜用法

 console.log(Object instanceof Object);//true  console.log(Function instanceof Function);//true  console.log(Number instanceof Number);//false  console.log(String instanceof String);//false   console.log(Function instanceof Object);//true   console.log(Foo instanceof Function);//true  console.log(Foo instanceof Foo);//false

看了上面的代碼是不是又暈頭轉向了?為什么 Object 和 Function instanceof 自己等于 true,而其他類 instanceof 自己卻又不等于 true 呢?如何解釋?要想從根本上了解 instanceof 的奧秘,需要從兩個方面著手:1,語言規范中是如何定義這個運算符的。2,JavaScript 原型繼承機制。

清單 5. JavaScript instanceof 運算符代碼

 function instance_of(L, R) {//L 表示左表達式,R 表示右表達式 var O = R.prototype;// 取 R 的顯示原型 L = L.__proto__;// 取 L 的隱式原型 while (true) {  if (L === null)  return false;  if (O === L)// 這里重點:當 O 嚴格等于 L 時,返回 true  return true;  L = L.__proto__;  }  }

清單 6. Object instanceof Object

 // 為了方便表述,首先區分左側表達式和右側表達式 ObjectL = Object, ObjectR = Object;  // 下面根據規范逐步推演 O = ObjectR.prototype = Object.prototype  L = ObjectL.__proto__ = Function.prototype  // 第一次判斷 O != L  // 循環查找 L 是否還有 __proto__  L = Function.prototype.__proto__ = Object.prototype  // 第二次判斷 O == L  // 返回 true

清單 7. Function instanceof Function

 // 為了方便表述,首先區分左側表達式和右側表達式 FunctionL = Function, FunctionR = Function;  // 下面根據規范逐步推演 O = FunctionR.prototype = Function.prototype  L = FunctionL.__proto__ = Function.prototype  // 第一次判斷 O == L  // 返回 true

清單 8. Foo instanceof Foo

// 為了方便表述,首先區分左側表達式和右側表達式 FooL = Foo, FooR = Foo;  // 下面根據規范逐步推演 O = FooR.prototype = Foo.prototype  L = FooL.__proto__ = Function.prototype  // 第一次判斷 O != L  // 循環再次查找 L 是否還有 __proto__  L = Function.prototype.__proto__ = Object.prototype  // 第二次判斷 O != L  // 再次循環查找 L 是否還有 __proto__  L = Object.prototype.__proto__ = null  // 第三次判斷 L == null  // 返回 false

簡析 instanceof 在 Dojo 繼承機制中的應用

在 JavaScript 中,是沒有多重繼承這個概念的,就像 Java 一樣。但在 Dojo 中使用 declare 聲明類時,是允許繼承自多個類的。下面以 Dojo 1.6.1 為例。

清單 9. Dojo 中多重繼承

 dojo.declare("Aoo",null,{});  dojo.declare("Boo",null,{});  dojo.declare("Foo",[Aoo,Boo],{});   var foo = new Foo();  console.log(foo instanceof Aoo);//true  console.log(foo instanceof Boo);//false   console.log(foo.isInstanceOf(Aoo));//true  console.log(foo.isInstanceOf(Boo));//true

上面的示例中,Foo 同時繼承自 Aoo 和 Boo,但當使用 instanceof 運算符來檢查 foo 是否是 Boo 的實例時,返回的是 false。實際上,在 Dojo 的內部,Foo 仍然只繼承自 Aoo,而通過 mixin 機制把 Boo 類中的方法和屬性拷貝到 Foo 中,所以當用 instanceof 運算符來檢查是否是 Boo 的實例時,會返回 false。所以 Dojo 為每個類的實例添加了一個新的方法叫 isInstanceOf,用這個方法來檢查多重繼承。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳江市| 固阳县| 永州市| 拉萨市| 莆田市| 盈江县| 三穗县| 长顺县| 杨浦区| 同德县| 杭州市| 宝应县| 芮城县| 霞浦县| 雅安市| 成都市| 肇庆市| 新丰县| 东乡族自治县| 资源县| 舒城县| 马山县| 界首市| 陈巴尔虎旗| 肇源县| 侯马市| 修水县| 利津县| 荔波县| 股票| 汉中市| 孙吴县| 阜新市| 新干县| 崇阳县| 绥棱县| 固原市| 永顺县| 台东县| 奉节县| 新河县|