2010-01-31 68 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

相关问题