如何检测传入ActionScript函数的参数对象是否为预期类型?
正确检测ActionScript对象是否为HotListItem类型的方法
嘿,我来帮你搞定这个类型检测的问题!你当前代码里用record.contains("HotListItem")是行不通的——contains()是String类的方法,用来检查字符串里的子串,而你的record是一个对象,这么写不仅达不到检测类型的目的,还可能触发运行时错误。
根据你看到的[object HotListItem]提示,说明这个对象确实是HotListItem类的实例,下面给你几种靠谱的类型检测方式:
1. 使用is运算符(推荐)
这是ActionScript 3中检测对象类型最常用、最直观的方式,它会判断对象是否是目标类或其子类的实例,完美适配大多数场景:
public function writeRecord(grid:IExtendedDataGrid, record:Object):String { ExternalInterface.call("alert","record " + record); if (record is HotListItem) { // 找到目标对象,执行你的逻辑 trace("当前对象是HotListItem(或其子类)的实例"); } else { // 对象类型不符 trace("对象类型不是HotListItem"); } }
2. 精确匹配类名(排除子类)
如果你需要严格检测对象就是HotListItem本身,不包含它的子类,可以用flash.utils.getQualifiedClassName()获取类的完整限定名来对比:
import flash.utils.getQualifiedClassName; public function writeRecord(grid:IExtendedDataGrid, record:Object):String { ExternalInterface.call("alert","record " + record); // 获取对象的类名和目标类的类名对比 if (getQualifiedClassName(record) == getQualifiedClassName(HotListItem)) { // 严格匹配HotListItem类的实例 trace("当前对象是HotListItem类的直接实例"); } else { // 对象类型不符 trace("对象不是HotListItem的直接实例"); } }
3. 使用constructor属性
另一种精确匹配的方式是直接对比对象的constructor属性,效果和上面的类名匹配类似,同样不会包含子类:
public function writeRecord(grid:IExtendedDataGrid, record:Object):String { ExternalInterface.call("alert","record " + record); if (record.constructor == HotListItem) { // 严格匹配HotListItem类的实例 trace("当前对象是HotListItem类的直接实例"); } else { // 对象类型不符 trace("对象不是HotListItem的直接实例"); } }
注意事项
- 确保你已经正确导入了
HotListItem类,否则会出现编译错误; - 优先使用
is运算符,因为它更符合面向对象的继承逻辑,除非你有严格匹配父类的特殊需求。
内容的提问来源于stack exchange,提问作者Kananga
相关产品推荐
相关产品推荐

