2010-01-31 32 views
12

是否可以檢查班級以查看它是否有方法?甚至特定的屬性檢查一個班級是否有方法

+0

好吧,它看起來像是如果我只是做一個if語句,檢查屬性是否定義的作品。但方法 – numerical25 2010-01-31 04:56:58

+0

相關:[Actionscript(flex):如何知道對象的屬性是否存在(或定義)?](http://stackoverflow.com/questions/1520610) – 2014-06-11 00:16:22

回答

29
var target:Object;// = some object 
var name:String;// = some name 
if(name in target){ 
    // if property/method exists 
}else{ 
    // if property/method not exists 
} 
+7

+1但請注意,這不會列出對象的私有/受保護屬性/功能。 – Amarghosh 2010-01-31 10:10:55

+1

是的,我可能不會需要它,如果它的私人或受保護的。謝謝 – numerical25 2010-01-31 19:20:47

+0

對於屬性/方法是否真正存在(即可枚舉),這是唯一正確的答案,因爲儘管保留值'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

2
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); 
} 

(注:從我的頭頂完成)

+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

+0

不需要使用非常緩慢的'describeType'。 – miguelSantirso 2012-05-14 14:13:47

+1

describeType可能會很慢,但是如果您創建一個方法將XML處理爲面向對象的結構並按類型名稱將其緩存在字典中,則只會在第一次運行時爲任何給定類型導致describeType開銷,之後按類型名稱查找簡單的字典緩存非常快(getQualifiedClassName(實例或類)約快3000倍)。 describeType唯一的問題是它沒有捕獲動態屬性,但這是設計。 – Triynko 2014-05-08 14:26:57

2

您還可以從陣列/查找方法,例如如下調用方法/屬性。如果它不存在,它將是'未定義的',也被視爲'假'。

var target:Object;// = some object 

if(target["propertyName"]){ 
    // if property/method exists 
}else{ 
    // if property/method not exists 
} 
+1

實際檢查未定義的if(target [「propertyName」] == undefined)''可能會更好。否則,如果屬性被定義,但設置爲「false」(即,一個空字符串,null,'0'或'false'),則它將被視爲「不存在」。 – IQAndreas 2012-09-17 20:29:24

+0

如果我嘗試在一個函數上使用它,它會在我錯誤1069時崩潰 - 即使只是檢查它是真是假。我正在用關鍵字this(用於語法研究)。爲什麼? – Panzercrisis 2013-08-27 14:46:33

+1

您必須使用嚴格相等(===)來比較'未定義'。另外,只有非類型變量'var x:*'可以存儲未定義的值。 Null是未定義的(==),但未定義(===),因此如果該屬性存在且爲null,則與未定義的==相比將返回true,儘管該屬性存在並保留一個空值。事實上,即使在嚴格平等的情況下,一個屬性也可以被定義並保存值「undefined」,它仍然與* undefined不相同(即運行一個for(var key:* in obj)循環仍然會返回財產)。因此,只有「if(key in obj)」是正確的。 – Triynko 2014-05-08 14:16:17

相關問題