1

我正在尝试遍历自定义类的属性,但是,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个。

感觉就像 Adob​​e 希望我们养成不良的编程习惯。言语让我失望...

4

1 回答 1

1

非动态类不提供可枚举的属性或方法。

如您提供的链接描述中所述。

设置循环操作的动态属性的可用性。

我想你可能想用这种方法重构你的代码。我从来没有像你在这里做的那样遍历类属性。如果您想动态跟踪项目,您应该使用关联数组并以这种方式跟踪它们,而不是像您正在做的那样在类级别。
如果您想要强数据类型,请使用向量。

于 2013-07-22T19:30:35.800 回答