是否可以檢查班級以查看它是否有方法?甚至特定的屬性檢查一個班級是否有方法
回答
var target:Object;// = some object
var name:String;// = some name
if(name in target){
// if property/method exists
}else{
// if property/method not exists
}
+1但請注意,這不會列出對象的私有/受保護屬性/功能。 – Amarghosh 2010-01-31 10:10:55
是的,我可能不會需要它,如果它的私人或受保護的。謝謝 – numerical25 2010-01-31 19:20:47
對於屬性/方法是否真正存在(即可枚舉),這是唯一正確的答案,因爲儘管保留值'undefined',即使嚴格相等,也可以實際定義屬性。例如:'var obj:Object = {a:undefined};'將追蹤'obj [「a」] === undefined',但是屬性「a」仍然被定義,如下面的循環跟蹤「a」:'(var key:* in obj)trace(key); //跟蹤「a」'。爲了擺脫這個屬性,你必須調用'delete obj [「a」]'。爲了嚴格看一個非空函數,'if(target [name]是Function')將是最好的。 – Triynko 2014-05-08 14:33:34
import flash.utils.describeType;
...
function methodExists(obj:Object,name:String):Boolean
{
var desc:XML=flash.utils.describeType(obj);
return (desc.method.(@name==name).length()>0);
}
(注:從我的頭頂完成)
「describeType」沒有列出動態屬性。例如:var target:Object = {a:123,b:「ASD」,c:function():void {trace(「hello」);}}' - 輸出一個plain的描述只有'hasOwnProperty','isPrototypeOf'和'propertyIsEnumerable'的對象。 – Amarghosh 2010-01-31 10:07:04
不需要使用非常緩慢的'describeType'。 – miguelSantirso 2012-05-14 14:13:47
describeType可能會很慢,但是如果您創建一個方法將XML處理爲面向對象的結構並按類型名稱將其緩存在字典中,則只會在第一次運行時爲任何給定類型導致describeType開銷,之後按類型名稱查找簡單的字典緩存非常快(getQualifiedClassName(實例或類)約快3000倍)。 describeType唯一的問題是它沒有捕獲動態屬性,但這是設計。 – Triynko 2014-05-08 14:26:57
您還可以從陣列/查找方法,例如如下調用方法/屬性。如果它不存在,它將是'未定義的',也被視爲'假'。
var target:Object;// = some object
if(target["propertyName"]){
// if property/method exists
}else{
// if property/method not exists
}
實際檢查未定義的if(target [「propertyName」] == undefined)''可能會更好。否則,如果屬性被定義,但設置爲「false」(即,一個空字符串,null,'0'或'false'),則它將被視爲「不存在」。 – IQAndreas 2012-09-17 20:29:24
如果我嘗試在一個函數上使用它,它會在我錯誤1069時崩潰 - 即使只是檢查它是真是假。我正在用關鍵字this(用於語法研究)。爲什麼? – Panzercrisis 2013-08-27 14:46:33
您必須使用嚴格相等(===)來比較'未定義'。另外,只有非類型變量'var x:*'可以存儲未定義的值。 Null是未定義的(==),但未定義(===),因此如果該屬性存在且爲null,則與未定義的==相比將返回true,儘管該屬性存在並保留一個空值。事實上,即使在嚴格平等的情況下,一個屬性也可以被定義並保存值「undefined」,它仍然與* undefined不相同(即運行一個for(var key:* in obj)循環仍然會返回財產)。因此,只有「if(key in obj)」是正確的。 – Triynko 2014-05-08 14:16:17
- 1. 檢查一個班級是否有副本?返回true或false
- 2. 黃瓜,如何檢查父母是否有某個班級?
- 3. 從一個班級到另一個班級是否安全?
- 4. 檢查多個班級
- 5. 檢查班級是否具有鑰匙值
- 6. 如何檢查班級名稱是否有效?
- 7. 檢查班級類型(.class)是否等於其他班級類型
- 8. 如何知道一個班級的成員是否是一種方法?
- 9. 這個班是一個班級嗎?
- 10. 從另一個班級調用方法?
- 11. 如何檢查所有班級或使用班級?
- 12. 你如何從另一個班級調用一個班級的方法?
- 13. 是否有可能在同一個班級有兩把鑰匙?
- 14. 最好的方法來檢查一個URL是否有效
- 15. 如何檢查一個java類是否有特定的方法?
- 16. Android - 檢查我來自哪個班級
- 17. 檢查類是否有靜態方法
- 18. libgdx InputListener:檢測一個演員是否從另一個班級被觸動
- 19. 我是否需要申報一個班級公衆(它是唯一一個沒有人會使用的班級中的班級)
- 20. Flash Builder:一個班級內的班級
- 21. 從另一個班級訪問班級?
- 22. 向另一個班級顯示班級
- 23. 一個班級需要另一個班級,其他班級需要第一個班級。我怎麼做?
- 24. 檢查,看是否有階級存在於一個複選框
- 25. 是否有方法檢查所有數組項是否爲'0'?
- 26. 一個班級是否有可能瞭解自己是否使用了反射?
- 27. 這個班級設計是否錯誤?
- 28. 從另一個班級撥打電話時限制班級的方法
- 29. 有一個班級只有一個班級使用的設計很差嗎?
- 30. 檢查班級是否具有typedef(私人或其他)的特徵
好吧,它看起來像是如果我只是做一個if語句,檢查屬性是否定義的作品。但方法 – numerical25 2010-01-31 04:56:58
相關:[Actionscript(flex):如何知道對象的屬性是否存在(或定義)?](http://stackoverflow.com/questions/1520610) – 2014-06-11 00:16:22