[英]Enumerating class properties
我试图遍历自定义类的属性,但是, Adobe提供的方法似乎不起作用。 我没有收到编译或运行时错误。
类
package {
public dynamic class enum {
public var foo:Number = 123;
public function enum() {
this.setPropertyIsEnumerable("foo", true);
if (this.propertyIsEnumerable("foo") == false) {
trace("foo:" + foo + " is not enumerable.")
}
}
}
}
// outputs "foo:bar is not enumerable."
Implementaiton
var test:enum = new enum();
for (var property:String in test) {
trace(property);
}
// outputs nothing
我试图保持我的代码快速灵活,所以当您必须将类更改为Dynamic以便能够在属性上for ... in
时,这确实令人沮丧。 杰克逊·邓斯坦(Jackson Dunstan)的测试证实,这可能比静态类的属性慢400倍 ,但是必须显式地引用这些属性 (对于不可知论的属性而言这是不切实际的),或者使用类的反射(在计算上昂贵)才能访问。
我发现避开整个问题的唯一方法是使用动态声明的变量……这是没有意义的,因为在那一点上,使用setPropertyIsEnumerable(prop,true)是多余的; 所有动态创建的属性均已枚举。 此外,不能对动态变量进行严格的数据类型化,并且性能超出了预期。
例如...
类
package {
public dynamic class enum {
public var foo:String = "apple";
public function enum(){
this.dynamicVar = "orange";
this.dynamicProp = "banana";
this.setPropertyIsEnumerable("foo", true);
this.setPropertyIsEnumerable("dynamicProp", false);
}
}
}
履行
var test:enum = new enum();
for (var key:String in test) {
trace(key + ": " + test[key]); // dynamicVar: 1
}
// outputs "dynamicVar: orange"
现在,该类是动态的,我们看到只对3个测试属性之一进行了迭代。 应该有2。
几乎感觉像Adobe要我们养成不良的编程习惯。 话让我失望...
非动态类不提供可枚举的属性或方法。
如您提供的链接说明中所述。
我认为您可能想在这种方法上重构代码。 我从来没有像您在这里那样遍历类的属性。 如果要动态跟踪项目,则应使用关联数组并以这种方式跟踪它们,而不是像在做的那样在类级别进行跟踪。
如果要进行强数据键入,请使用向量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.