簡體   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