[摘錄]JavaScript 對象的反射及應用

          摘錄地址:http://gis.javaeye.com/blog/24316

          JavaScript 對象的反射及應用

          關鍵字: JavaScript ? ????

          Java和.NET都有著比較完善的反射機制,用來處理未知的對象并獲取它們的屬性和方法。JavaScript雖然沒有完善的反射體系,但在編程的時候還是可以通過代碼設計來實現類似反射的基本功能。

          檢測一個JavaScript對象是否支持某種特定的屬性或方法:

          代碼
          1. if?(typeof(obj.property)?!=?"undefined")?{}??

          這樣聲明比直接使用"if (obj.property)"來描述要更準確,因為當obj.property的值為false、0、null的時候,雖然該屬性存在,但返回的結果卻恰恰相反。

          如果要求檢測更詳細一些,查看該屬性的具體類型,可以用instanceof操作符:

          代碼
          1. if?(obj?instanceof?PredefinedObj)?{}??

          但是,當對obj對象進行條件檢測的時候,如果多種條件的對象類型存在繼承關系,則需要注意代碼的書寫順序,例如:

          代碼
          1. function()?ExamineType(obj)?{ ??
          2. ??if?(obj?instanceof?Object)?{ ??
          3. ????alert("An?Object"); ??
          4. ??else?if?(obj?instanceof?Array)?{ ??
          5. ????alert("An?Array"); ??
          6. ??} ??
          7. ??} ??
          8. }??

          上述代碼執行的結果會認為原為Array類型的obj是一個Object,因為Array本身就是從Object繼承而來,顯然,將對Array的檢測放在前面會得到更精確的結果。因此,使用instanceof來判斷對象類型,需要注意當兩個對象存在繼承關系的時候,應該關注檢測順序的問題,進一步我們可以想到,JSON創建的對象不是Object就是Array,使用instanceof來檢測JSON對象意義不大。

          利用JavaScript的反射,我們可以編寫一個函數來檢查對象是否有一個特定名稱的函數,然后利用該函數進行計算,以此在JavaScript中實現接口的功能,為在Ajax中使用設計模式奠定基礎。

          代碼
          1. //this.getWeight和this["getWeight"]意義相同 ??
          2. //判斷對象是否存在指定名稱的函數 ??
          3. Object.prototype.hasFunc?=?function(func)?{ ??
          4. ??return?this?&&?this[func]?&&?this[func]?instanceof?Function; ??
          5. } ??
          6. ??
          7. function?hasWeight(obj)?{ ??
          8. ??return?obj.hasFunc("getWeight"); ??
          9. } ??
          10. ??
          11. //判斷參數是否為數值類型 ??
          12. function?isNum(param)?{ ??
          13. ??return?parseFloat(param)?!=?NaN; ??
          14. } ??
          15. ??
          16. //計算兩個對象的重量 ??
          17. function?calWeight(obj1,?obj2)?{ ??
          18. ??var?total?=?null; ??
          19. ??if?(hasWeight(obj1)?&&?hasWeight(obj2))?{ ??
          20. ????var?w1?=?obj1.getWeight(); ??
          21. ????var?w2?=?obj2.getWeight(); ??
          22. ????if?(isNum(w1)?&&?isNum(w2))?{ ??
          23. ??????total?=?parseFloat(w1)?+?parseFloat(w2); ??
          24. ????} ??
          25. ??} ??
          26. ??return?total; ??
          27. }??

          calWeight先判斷兩個對象是否均存在getWeight()函數,然后檢查getWeight()計算結果是否為數值類型,最后進行數值相加返回計算結果。需要注意的是,parseFloat(param)函數能夠除去param中非數字部分,如果param=16pm,parseFloat (16pm)得到的結果是16。如果不使用parseFloat(param)函數對getWeight()計算結果進行檢驗,那么會帶來安全性的問題,這種情況下可以將對象的getWeight()設計為返回字符串或其他類型,在調用它之前我們是不知道JavaScript函數的返回類型的,因為 JavaScript函數沒有預先定義的類型。



          歡迎大家訪問我的個人網站 萌萌的IT人

          posted on 2006-12-21 17:26 見酒就暈 閱讀(322) 評論(0)  編輯  收藏 所屬分類: HTML

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(3)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          BLOG

          FRIENDS

          LIFE

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 陆川县| 华亭县| 汝南县| 富裕县| 日喀则市| 祁门县| 比如县| 彩票| 积石山| 额敏县| 库车县| 油尖旺区| 吉木萨尔县| 晋中市| 克拉玛依市| 陆良县| 项城市| 大宁县| 元阳县| 福安市| 岢岚县| 会理县| 建平县| 绥江县| 偏关县| 鄂州市| 巴楚县| 交城县| 罗源县| 荥经县| 富川| 临西县| 丽水市| 谷城县| 石泉县| 昌江| 哈密市| 靖州| 石嘴山市| 静宁县| 黑水县|