繁体   English   中英

枚举类属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM