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

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

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

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數據加載中……

    JavaScript 對象的反射及應用

    ??? 作者:Flyingis

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

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

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

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

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

    if?(obj?instanceof?PredefinedObj)?{}

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

    function()?ExamineType(obj)?{
    ??
    if?(obj?instanceof?Object)?{
    ????alert(
    "An?Object");
    ??
    else?if?(obj?instanceof?Array)?{
    ????alert(
    "An?Array");
    ??}

    ??}

    }

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

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

    //this.getWeight和this["getWeight"]意義相同
    //
    判斷對象是否存在指定名稱的函數
    Object.prototype.hasFunc?=?function(func)?{
    ??
    return?this?&&?this[func]?&&?this[func]?instanceof?Function;
    }


    function?hasWeight(obj)?{
    ??
    return?obj.hasFunc("getWeight");
    }


    //判斷參數是否為數值類型
    function?isNum(param)?{
    ??
    return?parseFloat(param)?!=?NaN;
    }


    //計算兩個對象的重量
    function?calWeight(obj1,?obj2)?{
    ??
    var?total?=?null;
    ??
    if?(hasWeight(obj1)?&&?hasWeight(obj2))?{
    ????
    var?w1?=?obj1.getWeight();
    ????
    var?w2?=?obj2.getWeight();
    ????
    if?(isNum(w1)?&&?isNum(w2))?{
    ??????total?
    =?parseFloat(w1)?+?parseFloat(w2);
    ????}

    ??}

    ??
    return?total;
    }

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

    posted on 2006-09-12 18:50 Flyingis 閱讀(5857) 評論(5)  編輯  收藏 所屬分類: Web 客戶端技術

    評論

    # re: JavaScript 對象的反射及應用  回復  更多評論   


    你好,有個疑問---
    "parseFloat(param) != NaN"

    可以直接這樣比較嗎? 好像要利用 isNaN()函數吧?
    2006-09-19 18:37 | 飛飛

    # re: JavaScript 對象的反射及應用  回復  更多評論   

    @飛飛
    NaN就是指not a number,可以用來直接和變量比較。isNaN()是判斷函數,上面例子可以寫成:
    "parseFloat(param).isNaN() == false"。
    2006-09-20 10:29 | Flyingis

    # re: JavaScript 對象的反射及應用  回復  更多評論   

    這就叫多此一舉了,何不直接這樣呢:
    function isNum(param) {
    return !isNaN(parseFloat(param));
    }

    順便說一下,obj.property的值不但可以是null,false,0,也可以是undefined。這種情況下這個property也是存在的:
    var o={};
    o.a=undefined;
    for(var i in o) alert(typeof(o[i])=="undefined")
    2006-09-29 00:12 | emu

    # re: JavaScript 對象的反射及應用[未登錄]  回復  更多評論   

    useless
    2007-10-22 21:34 | aaa

    # re: JavaScript 對象的反射及應用  回復  更多評論   

    沒用
    2008-02-20 23:43 | 象的
    主站蜘蛛池模板: 亚洲&#228;v永久无码精品天堂久久 | 亚洲人成图片小说网站| 最新亚洲人成网站在线观看| 性盈盈影院免费视频观看在线一区| 亚洲欧洲春色校园另类小说| 中文字幕乱码免费视频| 亚洲一级毛片免费看| 免费人成视频在线| 亚洲av午夜国产精品无码中文字| 白白国产永久免费视频| 男女猛烈激情xx00免费视频| 国产亚洲情侣一区二区无| 18禁超污无遮挡无码免费网站| 亚洲国产美国国产综合一区二区| 1000部啪啪未满十八勿入免费| 日韩亚洲产在线观看| 免费看美女让人桶尿口| 一级毛片免费在线| 亚洲国产成人久久综合碰碰动漫3d| 麻豆视频免费播放| 亚洲AV无码AV男人的天堂不卡| 亚洲精品无码成人片在线观看| 成年女人A毛片免费视频| 亚洲天堂视频在线观看| 97在线线免费观看视频在线观看| 亚洲欧美日韩中文字幕在线一区| 亚洲国产综合精品一区在线播放| 99久久婷婷免费国产综合精品| 久久久久亚洲Av无码专| 免费无码黄网站在线观看| 国产精品高清免费网站| 亚洲国产精品无码久久久| 日韩高清在线高清免费| 国产一区二区三区免费观看在线| 亚洲天堂2016| 亚洲一区二区三区香蕉| 成人激情免费视频| 97人妻精品全国免费视频 | 欧洲人成在线免费| 国产亚洲福利在线视频| 亚洲国产一成人久久精品|