Actionscript 3 AS3中动态属性的隐式getter和setter?

Actionscript 3 AS3中动态属性的隐式getter和setter?,actionscript-3,getter-setter,Actionscript 3,Getter Setter,定义AS3类时,可以使用隐式getter和setter调用函数来执行简单的属性get/set操作。例如,我可以创建一个温度类,如下所示: public var celsius:Number; public function get fahrenheit():Number { return 9/5 * celsius + 32; } public function set fahrenheit(fahrenheit:Number):void { celsius = 5/9 *

定义AS3类时,可以使用隐式getter和setter调用函数来执行简单的属性get/set操作。例如,我可以创建一个温度类,如下所示:

public var celsius:Number;

public function get fahrenheit():Number {
    return 9/5 * celsius + 32;
}

public function set fahrenheit(fahrenheit:Number):void {
    celsius = 5/9 * (fahrenheit - 32);
}
然后,我可以像任何其他属性一样获取/设置华氏温度:

temperature.fahrenheit = 69.2;
这确实很有用,但据我所知,它只适用于类定义中声明的属性。但是,我发现能够在动态创建的属性上定义getter和setter非常有用。大概是这样的:

var obj:Object = new Object();
obj._foo = "bar";
obj.foo = function get () { return this._foo; };
obj.foo = function set (foo:String) { this._foo = foo; };

不幸的是,这样的语法并不存在,所以我的问题是:是否可以在AS3中动态创建属性getter和setter?

不幸的是,这是不可能的。仅使用自定义的旧式setter和getter(如setFahrenheitvalue:int和getFahrenheit:int)作为练习,还有另一种方法可以通过一个间接寻址来完成类似的事情(尽管不是直接等效的)。考虑下面的代码

class DynamicProperty {

    private var _getter:Function, _setter:Function;
    private var _source:*, _prop:String;

    public function DynamicProperty(source:*, prop:String, getter:Function, setter:Function):void {
        _getter = getter;
        _setter = setter;
        _source = source;
        _prop = prop;
    }

    public function get value():* {
        return _getter(_source[_prop]);
    }

    public function set value(val:*):void {
        _source[_prop] = _setter(val);
    }
}
这个小类接受一个实例,一个属性的名称,然后是两个函数,一个getter和一个setter。它只提供一个公共属性,名为value。公共getter和setter由传入的函数支持

然后要使用它们,您可以执行以下操作:

       var data:Object = {
           celsius: 0
       };

       data.kelvin = new DynamicProperty(data,"celsius", 
           function(v:Number):Number { return v + 273.15; }, 
           function(v:Number):Number { return v - 273.15; });
然后要访问开尔文,您可以使用:

data.kelvin.value


现在,我并不是说这是一个很好的方法,但这是在语言的限制下我能想到的最接近的方法。我们可以做一些明显的改进,即将传入的getter和setter抽象为静态方法以供重用。另一个好处是,由于ActionScript不支持用户泛型,因此可以创建强类型返回值类型的特定类。

您可以查看代理类http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.html 为了实现这一点。当然,对于这些能干能干的人来说,没有什么智慧可言。此外,您还需要扩展代理类,因此任何其他适合设计的继承都不可能与该类一起使用。

除非您通过闭包为修饰字段提供私有作用域,否则这是没有意义的。这确实很酷,但并不完全符合我的要求,虽然我相信我可以通过一些修改让它工作。我来看看!实际上,这正是我们所需要的。将该类连接到EventDispatcher,并内部化一些数组/对象方法,这样就有了一个事件触发对象。我总是想知道那门课有什么用;谢谢天主教徒!
data.kelvin.value = 0; // absolute zero