是否可以检查班级以查看它是否有方法?甚至特定的属性检查一个班级是否有方法
回答
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. 检查班级类型(.class)是否等于其他班级类型
- 5. 是否有可能在同一个班级有两把钥匙?
- 6. 最好的方法来检查一个URL是否有效
- 7. Android - 检查我来自哪个班级
- 8. 检查类是否有静态方法
- 9. 我是否需要申报一个班级公众(它是唯一一个没有人会使用的班级中的班级)
- 10. 从另一个班级访问班级?
- 11. 一个班级需要另一个班级,其他班级需要第一个班级。我怎么做?
- 12. 从另一个班级拨打电话时限制班级的方法
- 13. 检查,看是否有阶级存在于一个复选框
- 14. 一个班级是否有可能了解自己是否使用了反射?
- 15. 这个班级设计是否错误?
- 16. 有一个班级只有一个班级使用的设计很差吗?
- 17. 这是检查它是否是Multiple If或有ArrayList检查的有效方法
- 18. 如何在另一个班级内使用CSS样式一个班级但不影响主班级班级
- 19. 为了检查一个类是否有一个具有特定签名的方法,是否需要`void_t`?
- 20. 我是否可以在班级上班并设置一些值?
- 21. 检查一个属性是否有效
- 22. 检查一个HtmlElement是否有指令
- 23. 如何将一个班级应用到另一个班级?
- 24. 使用另一个班级的一个班级
- 25. 将信息从一个班级拉到另一个班级
- 26. 一个班级如何从另一个班级请求信息?
- 27. 控制另一个班级的另一个班级
- 28. 是否有一个聪明的方法来检查代码是否asm.js是否有效?
- 29. 是否有.net方法检查用户密码是否简单
- 30. CMake - 是否有方法检查测试是否启用?
好吧,它看起来像是如果我只是做一个if语句,检查属性是否定义的作品。但方法 – numerical25 2010-01-31 04:56:58
相关:[Actionscript(flex):如何知道对象的属性是否存在(或定义)?](http://stackoverflow.com/questions/1520610) – 2014-06-11 00:16:22