我正在尝试遍历自定义类的属性,但methods provided by 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's testing confirms that this can be 400x slower than static class properties,但必须明确引用(对于属性不可知的方法不切实际),或者使用类的反射(计算成本高)才能访问。
我发现回避整个问题的唯一方法是使用动态声明的变量......这是没有意义的,因为在那时使用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几乎感觉Adobe希望我们采用糟糕的编程习惯。言语让我失望......
答案 0 :(得分:1)
非动态类不提供可枚举的属性或方法。
如您所提供的链接说明中所述。
Sets the availability of a dynamic property for loop operations.
我认为你可能想要在这种方法上重构你的代码。
我从来没有像你在这里那样遍历类属性。
如果要动态跟踪项目,则应使用关联数组,并以类似于您正在进行的类级别跟踪它们。
如果你想要强大的数据输入,那么使用矢量。