【问题标题】:Check to see if a class has a method检查一个类是否有方法
【发布时间】:2011-01-11 08:23:02
【问题描述】:

是否可以检查一个类以查看它是否具有方法?甚至是特定的属性

【问题讨论】:

标签: flash actionscript-3 actionscript flash-cs4


【解决方案1】:
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 但请注意,这不会列出对象的私有/受保护属性/功能。
  • 是的,如果它是私有的或受保护的,我可能不需要它。谢谢
  • 这是关于属性/方法是否真的存在(即它是可枚举的)的唯一正确答案,因为尽管持有值“未定义”,但实际上可以定义属性,即使严格相等也是如此.例如: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)
【解决方案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);
}

(注意:在我的头顶上完成)

【讨论】:

  • describeType 不列出动态属性。例如,在这个对象上试一试:var target:Object = {a:123, b:"ASD", c:function():void{trace("hello");}} - 仅输出带有 hasOwnPropertyisPrototypeOfpropertyIsEnumerable 的普通对象的描述。
  • 不需要使用非常慢的'describeType'。
  • describeType 可能很慢,但是如果您创建一个方法来将 XML 处理为面向对象的结构并按类型名称将其缓存在字典中,您将只在任何给定类型的第一次运行,之后按类型名称进行简单的字典缓存查找非常快(getQualifiedClassName(instance or class) 大约快 3000 倍)。 describeType 唯一的问题是它不捕获动态属性,但这是设计使然。
【解决方案3】:

您还可以从数组/查找方法中调用方法/属性,如下所示。如果它不存在,它将是“未定义”,也算作“假”。

var target:Object;// = some object

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

【讨论】:

  • 实际检查未定义的if(target["propertyName"] == undefined) 可能会更好。否则,如果属性已定义但设置为计算结果为 false 的值(即 emtpy 字符串、null0false),它将被视为“不存在”。
  • 如果我尝试在一个函数上使用它,它会在我身上崩溃并出现错误 1069 - 即使只是检查它是真还是假。我正在使用关键字 this (用于句法研究)。为什么?
  • 您必须使用严格相等 (===) 来比较 undefined。此外,只有无类型变量var x:* 可以存储未定义的值。 Null 是 (==) 到未定义,但不是 (===) 到未定义,因此如果属性存在并且为 null,则与使用 == 的未定义进行比较将返回 true,尽管属性存在并持有 null 值。事实上,即使严格相等,一个属性也可以被定义并持有值“undefined”,这仍然与being undefined(即运行一个for ( var key:* in obj) 循环仍将返回该属性)。因此,只有if(key in obj) 是正确的。
猜你喜欢
  • 2012-05-21
  • 2016-02-29
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多