检查一个类是否有一个方法。

12

能否检查一个类是否具有某个方法或特定属性?


看起来好像只需使用一个 if 语句来检查该属性是否被定义即可。但是方法呢? - numerical25
3个回答

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
1
是的,如果它是私有的或受保护的,我可能不需要它。谢谢。 - numerical25
这是唯一正确的答案,关于一个属性/方法是否真正存在(即它是可枚举的),因为一个属性实际上可以被定义,尽管它持有值“undefined”,即使使用严格相等。例如:var obj:Object = {a:undefined};将对obj["a"] === undefined返回true,但是属性“a”仍然被定义,如下循环跟踪“a”所示:for (var key:* in obj) trace(key); //traces "a"。要摆脱该属性,您必须调用delete obj["a"]。要严格查找非空函数,最好使用if(target[name] is Function) - Triynko

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 的内容(即空字符串、null0false),它将被视为“不存在”。 - IQAndreas
如果我尝试在函数中使用它,即使只是检查它是真还是假,它也会崩溃并显示错误1069。我正在使用关键字this进行语法研究。为什么? - Panzercrisis
1
在比较undefined时,必须使用严格相等运算符(===)。只有未声明类型的变量var x:*可以存储值为undefined的变量。nullundefined之间可以使用相等运算符(==)进行比较,但不能使用严格相等运算符(===),因此如果属性存在且为null,则使用==undefined进行比较将返回true,尽管该属性存在并保存了null值。实际上,即使使用严格相等性,属性也可以被定义并保存值“undefined”,这仍然不同于未定义(例如,运行for(var key:* in obj)循环仍将返回该属性)。因此,只有if(key in obj)是正确的。 - Triynko

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

(Note: done off the top of my head)


describeType不列出动态属性。例如,尝试在此对象上使用:var target:Object = {a:123, b:"ASD", c:function():void{trace("hello");}} - 输出一个普通对象的描述,只包含hasOwnPropertyisPrototypeOfpropertyIsEnumerable - Amarghosh
不需要使用非常慢的“describeType”。 - miguelSantirso
1
describeType可能会比较慢,但如果您创建一个方法将XML处理成面向对象的结构并按类型名称缓存到字典中,那么对于任何给定类型,您只会在第一次运行时承担describeType的开销,之后通过类型名称进行简单的字典缓存查找非常快(getQualifiedClassName(instance或class)大约快3000倍)。describeType的唯一问题是它无法捕获动态属性,但这是有意设计的。 - Triynko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接