我正在尝试遍历自定义类的属性,但是,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."
实施
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 希望我们养成不良的编程习惯。言语让我失望...