摘錄地址:
http://gis.javaeye.com/blog/24316關(guān)鍵字: JavaScript ? ????
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ǔ)。 代碼 - ??
- ??
- 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()函數(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ù)沒有預先定義的類型。 |