<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    [摘錄]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 見酒就暈 閱讀(310) 評論(0)  編輯  收藏 所屬分類: HTML

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(3)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    BLOG

    FRIENDS

    LIFE

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 亚洲国产精品无码中文字| 免费大片av手机看片| 国产一区二区三区免费在线观看 | 免费在线看黄网站| 亚洲成Av人片乱码色午夜| 久久久WWW成人免费精品| 亚洲综合av永久无码精品一区二区 | 国产亚洲色视频在线| 中文字幕无线码免费人妻| 国产V亚洲V天堂A无码| 久久久久成人精品免费播放动漫| 亚洲国产精品va在线播放| 久久精品中文字幕免费| 亚洲成人黄色在线观看| 国产精品免费观看久久| 亚洲爆乳精品无码一区二区| 国产又粗又长又硬免费视频| 日产久久强奸免费的看| 久久精品亚洲综合| 久久久久久精品成人免费图片| 亚洲免费电影网站| 亚洲精品人成无码中文毛片| 美女视频黄频a免费观看| 日本免费一区二区在线观看| 亚洲人成电影网站| 免费v片视频在线观看视频| 久久99精品免费一区二区| 麻豆亚洲av熟女国产一区二| 成人免费无毒在线观看网站| 无遮挡国产高潮视频免费观看| 亚洲av色福利天堂| 四虎影院免费视频| 中文字字幕在线高清免费电影| 亚洲日本视频在线观看| 亚洲成a人片在线观看日本麻豆| 久久免费区一区二区三波多野| 亚洲色最新高清av网站| 亚洲精品无码精品mV在线观看| 97视频热人人精品免费| 久久精品无码专区免费|