2009-09-09 101 views
-1

在ActionScript 3中開發時,我經常發現自己正在尋找一種方法來實現類似於python的魔術方法提供的東西,即能夠攔截實例上的屬性查找,並執行一些自定義操作。是否可以攔截ActionScript 3中的屬性獲取/設置?

有什麼可以接受的方式在ActionScript 3中實現這一點?在AS3屬性查找中對於普通(密封)和動態類的表現有點不同 - 理想情況下,這兩種情況下的工作方式都是相同的。在python中,這對於所有類型的對象(當然!)來說都很漂亮,即使是字典本身的子類也是如此!

回答

0

看一個flash.utils.Proxy對象。

Proxy類用於覆蓋對象的ActionScript的 默認行爲(如檢索和 修改屬性)的對象上 操作。

+0

我傾向於約flash.utils.Proxy忘記 - 因爲你只能通過延長其使用它。這太過於束縛了......考慮到AS3不支持多重繼承,它使得使用代理(當擴展任何其他類型時)不可能覆蓋GetProperty/setProperty行爲。 – 2009-09-09 12:54:25

0

在as3中,您可以編寫顯式變量的訪問器。 ex Class1:

private var __myvar:String;

public function get myvar():String {return __myvar; } public function set myvar(value:String):void {__myvar = value; }

現在,當您創建Class1的實例時,您可以通過訪問器函數訪問__myvar。 如果你想設置可綁定的var,你必須在其一個訪問器上放置[Bindable]關鍵字。 更進一步, 你也可以只實現getter或setter,所以你的var只能讀或寫。 我希望它幫助;)

pigiuz

+0

但是如果先驗你不知道你需要的屬性是什麼?即動態物體例如對象,字典? import flash.utils.Dictionary; var d:Dictionary = new Dictionary; d [「abc」] = 123; //如何截取這個集合的屬性? trace(d [「abc」]); //如何攔截此獲取屬性? 儘管仍然沒有丟失基本對象的真實本質,即如果字典(或其子類)它應該繼續表現得像一樣,即使用字典也可以做任何你可以做的事。循環鍵: (var key:d中的對象){trace(key,d [key]); } – 2009-09-14 10:07:45

+0

as3這是不可能的,除非你爲每個屬性編寫訪問器(或者你採用代理對象的方式)。 一個骯髒的解決方法可能是爲每個基本數據類型編寫一個包裝類,比如MyInterceptorArray或MyInterceptorDictionary,其中您只需包裝私有數組,字典或任何通過您的手工訪問器訪問它的內容。這裏有一個很酷的lib(http://code.google.com/p/as3ds),它實現了數據結構。 as3不是一種pythonic語言,它更像java編碼,動態對象大多是一種糟糕的編程方式。 – pigiuz 2009-09-14 14:10:52

相關問題