<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, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

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

    ??? 作者:Flyingis

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

    ??? 檢測(cè)一個(gè)JavaScript對(duì)象是否支持某種特定的屬性或方法:

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

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

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

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

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

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

    ??}

    }

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

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

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


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


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


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

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

    評(píng)論

    # re: JavaScript 對(duì)象的反射及應(yīng)用  回復(fù)  更多評(píng)論   


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

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

    # re: JavaScript 對(duì)象的反射及應(yīng)用  回復(fù)  更多評(píng)論   

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

    # re: JavaScript 對(duì)象的反射及應(yīng)用  回復(fù)  更多評(píng)論   

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

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

    # re: JavaScript 對(duì)象的反射及應(yīng)用[未登錄]  回復(fù)  更多評(píng)論   

    useless
    2007-10-22 21:34 | aaa

    # re: JavaScript 對(duì)象的反射及應(yīng)用  回復(fù)  更多評(píng)論   

    沒用
    2008-02-20 23:43 | 象的
    主站蜘蛛池模板: 亚洲精品美女在线观看播放| 久久久久噜噜噜亚洲熟女综合| 亚洲日韩国产精品无码av| 日本免费一二区在线电影| 国产成人亚洲综合| 亚洲综合图片小说区热久久| 三上悠亚电影全集免费| 成年女人色毛片免费看| 亚洲ts人妖网站| 无码乱肉视频免费大全合集| 亚洲午夜无码AV毛片久久| 国产三级在线免费观看| 亚洲午夜久久久影院| 免费一区二区三区| 久久综合亚洲色一区二区三区| 一级做a爰片性色毛片免费网站| 1000部拍拍拍18勿入免费视频下载| 亚洲国产精品国自产拍电影| 人妻无码一区二区三区免费| 亚洲一区精品无码| 久久免费精彩视频| 亚洲一区二区三区在线观看蜜桃| 操美女视频免费网站| 国产亚洲视频在线观看网址| 久久影视综合亚洲| 91香蕉国产线观看免费全集| 国产 亚洲 中文在线 字幕| 免费jjzz在线播放国产| 成在人线av无码免费高潮水| 亚洲黄色片免费看| 国产一级淫片免费播放| 国产成人无码区免费内射一片色欲 | 老司机午夜免费视频| 亚洲色大成网站www永久一区 | 亚洲天堂一区二区三区四区| 青娱分类视频精品免费2| 亚洲欧美日韩综合久久久| 亚洲高清视频免费| 国产情侣久久久久aⅴ免费 | 97视频免费观看2区| 一个人看的免费高清视频日本|