成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript操作符instanceof揭秘

開發 前端
在JavaScript中,我們可以用instanceof操作符來判斷對象是否是某個類的實例,如果obj instaceof Class返回true,那么我們認為obj是Class的實例,obj要么由Class創建,要么由Class的子類創建。

在JavaScript中,我們可以用instanceof操作符來判斷對象是否是某個類的實例,如果obj instaceof Class返回true,那么我們認為obj是Class的實例,obj要么由Class創建,要么由Class的子類創建。來自Java或其他強類型語言的開發者一定認為如果obj instaceof Class返回true,那么obj肯定擁有Class的所有屬性。事實是這樣么?我們看下面的代碼:(斑頭雁原創:http://bantouyan.iteye.com)

Js代碼

  1. function ClassA()     
  2. {     
  3.     this.ma = 'ClassA';     
  4. }     
  5. ClassA.prototype.fa = function(){return 'prototype function';};     
  6.     
  7. function ClassB()     
  8. {     
  9.     this.mb = 'ClassB';     
  10. }     
  11. ClassB.prototype = ClassA.prototype;     
  12.     
  13. var obja = new ClassA();     
  14. alert(('ma' in obja) + ' ' + obja.hasOwnProperty('ma')); //output true true     
  15. alert(('mb' in obja) + ' ' + obja.hasOwnProperty('mb')); //output false false     
  16. alert(('fa' in obja) + ' ' + obja.hasOwnProperty('fa')); //output true false     
  17. alert(('fb' in obja) + ' ' + obja.hasOwnProperty('fb')); //output true false     
  18. alert(obja instanceof ClassA);   //output true     
  19. alert(obja instanceof ClassB);   //output true     
  20.     
  21. var objb = new ClassB();     
  22. alert(('ma' in objb) + ' ' + objb.hasOwnProperty('ma')); //output false false     
  23. alert(('mb' in objb) + ' ' + objb.hasOwnProperty('mb')); //output true true     
  24. alert(('fa' in objb) + ' ' + objb.hasOwnProperty('fa')); //output true false     
  25. alert(('fb' in objb) + ' ' + objb.hasOwnProperty('fb')); //output true false     
  26. alert(objb instanceof ClassA);   //output true     
  27. alert(objb instanceof ClassB);   //output true    

 

在這段代碼中,我們定義了兩個類,ClassA與ClassB,還給ClassA創建了原型方法fa,給ClassB創建了原型方法fb,并分別創建了對象obja與objb。直覺上,我們并不認為ClassA與ClassB是同一個類,所以obja不是ClassB的實例,objb也不是ClassA的實例,而且obja不會擁有屬性fb,objb也不會擁有屬性fa,但是運行結果告訴我們,JavaScript并不這樣認為。obja與objb都擁有屬性fa與fb,它們既是ClassA的實例也是ClassB的實例。下面我們分析一下原因。(斑頭雁原創:http://bantouyan.iteye.com)

ClassA的prototype與ClassB的prototype是同一個對象,所以給ClassA增加原型方法fa會影響到ClassB,給ClassB增加的原型方法fb也會影響到ClassA,所以obja與objb都擁有屬性fa與fb,這一點也比較容易理解。oba沒有ClassB的實例屬性mb但卻是ClassB的實例,objb也沒有ClassA的實例屬性ma但卻是ClassA的實例,這說明instanceof的判斷與實例屬性無關。既然instanceof與實例屬性無關,那么它就跟原型屬性有關。事實上,JavaScript根據原型判定instanceof的運算結果。(斑頭雁原創:http://bantouyan.iteye.com)

我們知道同一個構造函數所創建的對象與這個構造函數共享同一個原型(只不一般不能直接訪問過對象的原型),而ClassA與ClassB也共享同一個原型,那么obja與objb也共享同一個原型,所以可以這樣認為,如果對象與類共享一個原型,那么對象就是這個類的實例,instanceof運算就返回true。下面我們看一下繼承的情況。(斑頭雁原創:http://bantouyan.iteye.com)

Js代碼

  1. function ClassA()     
  2. {     
  3.     this.ma = 'ClassA';     
  4. }     
  5. ClassA.prototype.fa = function(){return 'prototype function fa';};     
  6.     
  7. function ClassB()     
  8. {     
  9.     this.mb = 'ClassB';     
  10. }     
  11. ClassB.prototype = ClassA.prototype;     
  12. ClassB.prototype.fb = function(){return 'prototype function fb';};     
  13.     
  14. function ClassC()     
  15. {     
  16.     this.mc = 'ClassC';     
  17. }     
  18. ClassC.prototype = new ClassB();     
  19. ClassC.prototype.fc = function(){return 'prototype function fc';};     
  20.     
  21. var objc = new ClassC();     
  22. alert(objc instanceof ClassB);   //output true     
  23. alert(objc instanceof ClassA);   //output true     
  24. alert(('ma' in objc) + ' ' + objc.hasOwnProperty('ma')); //output false false     
  25. alert(('mb' in objc) + ' ' + objc.hasOwnProperty('mb')); //output true false     
  26. alert(('mc' in objc) + ' ' + objc.hasOwnProperty('mc')); //output true true     
  27. alert(('fa' in objc) + ' ' + objc.hasOwnProperty('fa')); //output true false     
  28. alert(('fb' in objc) + ' ' + objc.hasOwnProperty('fb')); //output true false     
  29. alert(('fc' in objc) + ' ' + objc.hasOwnProperty('fc')); //output true false    

 

ClassC采用原型鏈方法繼承了ClassB,所以ClassC的對象objc是ClassB的實例,但是運行結果告訴我們,objc也是ClassA的實例。objc是ClassC的實例,所以objc與ClassC共享一個原型。ClassC的原型是ClassB的實例,所以ClassC的原型的原型與ClassB的原型是同一個原型,而ClassB與ClassA共享同一個原型,所以ClassC的原型的原型與ClassA的原型是同一個原型,即objc的原型的原型與ClassA的原型是同一個原型。由此看來,instanceof可以根據對象原型的原型,即原型鏈上的原型,判定運算的結果,即如果類的原型與對象原型鏈上的某一個原型是同一個對象,那么instanceof運算將返回true,否則返回false。下面我們用一段更長的代碼來驗證這個結論。(斑頭雁原創:http://bantouyan.iteye.com)

Js代碼

  1. function ClassA()     
  2. {     
  3.     this.ma = 'ClassA';     
  4. }     
  5. ClassA.prototype.fa = function(){return 'prototype function fa';};     
  6.     
  7. function ClassB()     
  8. {     
  9.     this.mb = 'ClassB';     
  10. }     
  11. ClassB.prototype = ClassA.prototype;     
  12. ClassB.prototype.fb = function(){return 'prototype function fb';};     
  13.     
  14. function ClassC()     
  15. {     
  16.     this.mc = 'ClassC';     
  17. }     
  18. ClassC.prototype = new ClassB();     
  19. ClassC.prototype.fc = function(){return 'prototype function fc';};     
  20.     
  21. function ClassD()     
  22. {     
  23.     this.md = 'ClassD';     
  24. }     
  25. ClassD.prototype = ClassC.prototype;     
  26. ClassC.prototype.fd = function(){return 'prototype function fd';};     
  27.     
  28. function ClassE()     
  29. {     
  30.     this.me = 'ClassE';     
  31. }     
  32. ClassE.prototype = new ClassD();     
  33. ClassE.prototype.fe = function(){return 'prototype function fe';};     
  34.     
  35. var obje = new ClassE();     
  36. alert(obje instanceof ClassA);   //output true     
  37. alert(obje instanceof ClassB);   //output true     
  38. alert(obje instanceof ClassC);   //output true     
  39. alert(obje instanceof ClassD);   //output true     
  40. alert(obje instanceof ClassE);   //output true     
  41.     
  42. alert(('ma' in obje) + ' ' + obje.hasOwnProperty('ma')); //output false false     
  43. alert(('mb' in obje) + ' ' + obje.hasOwnProperty('mb')); //output true false     
  44. alert(('mc' in obje) + ' ' + obje.hasOwnProperty('mc')); //output false false     
  45. alert(('md' in obje) + ' ' + obje.hasOwnProperty('md')); //output true false     
  46. alert(('me' in obje) + ' ' + obje.hasOwnProperty('me')); //output true true     
  47.     
  48. alert(('fa' in obje) + ' ' + obje.hasOwnProperty('fa')); //output true false     
  49. alert(('fb' in obje) + ' ' + obje.hasOwnProperty('fb')); //output true false     
  50. alert(('fc' in obje) + ' ' + obje.hasOwnProperty('fc')); //output true false     
  51. alert(('fd' in obje) + ' ' + obje.hasOwnProperty('fd')); //output true false     
  52. alert(('fe' in obje) + ' ' + obje.hasOwnProperty('fe')); //output true false    

 

ClassA的原型與ClassB的原型共享同一個對象,ClassC的原型與ClassD的原型也共享一個對象,而ClassC是ClassB的子類,ClassE是ClassD的子類,而obje是ClassE的實例。所以obje的原型鏈的***個原型是ClassE的原型,它是ClassD的實例,故第二個原型是ClassD的原型,也就是ClassC的原型,ClassC的原型是ClassB的實例,所以原型鏈上第三個原型是ClassB的原型,也就是ClassA的原型。所以,ClassA、ClassB、ClassC、ClassD與ClassE的原型都在對象obje的原型鏈上,所以obje是這些類的實例。這也驗證了前面的結論,即如果類的原型與對象原型鏈上的某一個原型是同一個對象,那么instanceof運算將返回true。雖然obje是ClassA、ClassC的實例,但是它并沒有ClassA的實例屬性ma,ClassC的實例屬性mc。(斑頭雁原創:http://bantouyan.iteye.com)

綜合前面的論述與驗證,我們可以得出結論,如果obj instanceof Class返回true,那么Class的原型與obj原型鏈上的某個原型是同一個對象,但這并不意味著obj擁有Class的所有實例屬性(但肯定擁有Class的所有原型屬性)。

【編輯推薦】

  1. 10個超棒的HTML 5素描及繪畫設計工具
  2. 學習HTML 5十佳站點推薦
  3. 12個精妙有趣的HTML 5應用
  4. 10個令人驚奇的HTML5和JavaScript效果
  5. 技術大牛談HTML 5設計原理
責任編輯:金賀 來源: ITEYE博客
相關推薦

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2021-10-31 18:59:55

Python操作符用法

2009-07-21 09:31:00

Scala操作符

2009-09-15 17:16:58

LINQ查詢操作符

2012-02-06 09:13:23

LINQ

2009-09-16 09:09:23

Linq Contai

2010-07-14 14:18:51

Perl操作符

2010-07-14 14:30:31

Perl操作符

2010-07-19 11:00:24

Perl操作符

2010-01-28 11:16:28

C++操作符

2025-03-11 07:30:00

雙問號操作符JavaScript開發

2010-01-27 11:00:17

C++操作符

2017-01-03 15:56:20

RxJava操作符Android

2022-10-08 07:49:55

New操作符函數

2009-11-27 09:41:56

LINQ

2016-12-28 09:48:09

AndroidRxJava操作符

2016-12-28 09:54:50

AndroidRxJava操作符

2017-01-03 16:12:13

RxJava操作符Android

2009-07-14 18:34:22

Jython操作符重載
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线视频h| 免费精品国产 | 欧美中文字幕一区二区三区亚洲 | 欧美一区二区三区大片 | 欧美精品一区二区在线观看 | 久久综合一区二区三区 | 91精品国产综合久久国产大片 | 国产精品乱码一区二区三区 | 蜜桃久久 | 亚洲高清视频在线 | 高清一区二区三区 | 成人免费一级 | 久久久精品视频免费看 | 亚洲精品久久久久久下一站 | 91毛片网| 久久精品视频免费看 | 亚洲一区 | 美日韩精品 | 国产精品爱久久久久久久 | 久久精品一级 | 五月激情婷婷网 | 日韩av在线一区 | 欧美国产精品一区二区三区 | 亚洲日本乱码在线观看 | 精品真实国产乱文在线 | 国产一区二区三区不卡av | 国产精品一区二区三区在线 | 国产午夜精品一区二区三区 | 亚洲欧美激情精品一区二区 | 一区二区三区免费 | 久久在线| 久久高潮 | 久久久国产精品 | av黄色国产 | 久视频在线观看 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 午夜国产 | 激情五月综合 | 国产精品国产精品国产专区不片 | 国产精品一区视频 | 91免费高清视频 |