Flyingis

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

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

          ??? 作者:Flyingis

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

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

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

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

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

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

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

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

          ??}

          }

          ??? 上述代碼執(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ǔ)。

          //this.getWeight和this["getWeight"]意義相同
          //
          判斷對象是否存在指定名稱的函數(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;
          }


          //計算兩個對象的重量
          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()函數(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ù)沒有預先定義的類型。

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

          評論

          # re: JavaScript 對象的反射及應(yīng)用  回復  更多評論   


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

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

          # re: JavaScript 對象的反射及應(yīng)用  回復  更多評論   

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

          # re: JavaScript 對象的反射及應(yīng)用  回復  更多評論   

          這就叫多此一舉了,何不直接這樣呢:
          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 對象的反射及應(yīng)用[未登錄]  回復  更多評論   

          useless
          2007-10-22 21:34 | aaa

          # re: JavaScript 對象的反射及應(yīng)用  回復  更多評論   

          沒用
          2008-02-20 23:43 | 象的
          主站蜘蛛池模板: 渑池县| 莱西市| 五家渠市| 曲阜市| 广南县| 白河县| 宁远县| 石城县| 灯塔市| 丹巴县| 阿拉善右旗| 象山县| 普安县| 奇台县| 鹤峰县| 米易县| 斗六市| 临沭县| 会理县| 内江市| 景洪市| 五华县| 错那县| 南雄市| 娄底市| 常熟市| 东台市| 天津市| 临朐县| 黎城县| 桐梓县| 民县| 柘荣县| 石河子市| 九寨沟县| 涟水县| 长宁县| 徐汇区| 孝感市| 阿图什市| 浦城县|