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

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

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

    [摘錄]JavaScript 對象的反射及應(yīng)用

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

    JavaScript 對象的反射及應(yīng)用

    關(guān)鍵字: JavaScript ? ????

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

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

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

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

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

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

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

    代碼
    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. }??

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

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

    代碼
    1. //this.getWeight和this["getWeight"]意義相同 ??
    2. //判斷對象是否存在指定名稱的函數(shù) ??
    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. //判斷參數(shù)是否為數(shù)值類型 ??
    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()函數(shù),然后檢查getWeight()計算結(jié)果是否為數(shù)值類型,最后進行數(shù)值相加返回計算結(jié)果。需要注意的是,parseFloat(param)函數(shù)能夠除去param中非數(shù)字部分,如果param=16pm,parseFloat (16pm)得到的結(jié)果是16。如果不使用parseFloat(param)函數(shù)對getWeight()計算結(jié)果進行檢驗,那么會帶來安全性的問題,這種情況下可以將對象的getWeight()設(shè)計為返回字符串或其他類型,在調(diào)用它之前我們是不知道JavaScript函數(shù)的返回類型的,因為 JavaScript函數(shù)沒有預先定義的類型。



    歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人

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

    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統(tǒng)計

    常用鏈接

    留言簿(3)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    BLOG

    FRIENDS

    LIFE

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲黄色免费观看| 亚洲av日韩综合一区在线观看| 2020年亚洲天天爽天天噜| 蜜桃视频在线观看免费视频网站WWW| 日韩亚洲一区二区三区| 中国一级特黄的片子免费| 亚洲真人日本在线| 中文字幕不卡高清免费| 久久精品国产亚洲香蕉| 国产成人一区二区三区视频免费| 亚洲精品免费视频| 亚洲黄色免费网址| 精品丝袜国产自在线拍亚洲| 日本免费高清一本视频| 人人鲁免费播放视频人人香蕉| 337p日本欧洲亚洲大胆裸体艺术| 三年片免费观看大全国语| 亚洲人成在线播放网站岛国| 日本视频一区在线观看免费| 亚洲午夜无码久久| 亚洲七七久久精品中文国产| 国产午夜精品久久久久免费视 | 久久久久久久99精品免费| 久久久久亚洲av无码专区喷水| 中字幕视频在线永久在线观看免费 | 亚洲色在线无码国产精品不卡| 日韩免费无码一区二区视频| 一级成人生活片免费看| 久久亚洲AV成人无码电影| 成人免费777777| 国产精品免费久久久久影院| 亚洲AV人无码综合在线观看| 在线观看免费大黄网站| 久久WWW免费人成—看片| 亚洲国产福利精品一区二区| 亚洲av鲁丝一区二区三区| 亚洲一区二区免费视频| 激情小说亚洲色图| 亚洲图片在线观看| 亚洲成?Ⅴ人在线观看无码| 色猫咪免费人成网站在线观看|