私有属性的名称 [Binable] 生成

Posted

技术标签:

【中文标题】私有属性的名称 [Binable] 生成【英文标题】:Name of the Private Property [Binable] Generates 【发布时间】:2013-01-18 14:29:02 【问题描述】:

我的 ActionScript 类中有一个可绑定的公共属性,我想访问由 [Bindable] 标记生成的私有 var。

例如,如果我声明:

[Bindable] public var yummyTime:String = "abcdefghij";

在运行时,它将值存储在名为_719695190yummyTime 的变量中。有人知道我如何预测这个名字吗?

【问题讨论】:

【参考方案1】:

即使你可以预测那个名字;您将无法在编译时访问它,因为您会收到未定义变量的编译器错误。为什么需要访问它?

我怀疑你想做的任何事情都可以通过将你的公共变量定义扩展为定义了 Bindable 事件的 get/set 方法来完成。像这样:

private var _yummyTime : String = 'abcdefghij'
[Bindable(event='yummyTimeChanged'] 
public function get yummyTime():String
 return _yummyTime;


public function set yummyTime(value:String):void
 _yummyTime = value;
 dispatchEvent(new Event('yummyTimeChanged'));

然后在您的组件中,您将拥有私有变量 _yummyTime 和公共变量 yummyTime。

【讨论】:

只是为了避免混淆:自定义事件并不是绝对必要的。它可以使用简单的[Bindable] 标签,也不需要“手动”事件调度。 @RIAstar 我会接受这是真的,但我从未尝试过。 Flex 框架中的每个类都手动调度 change 事件;我只是在自己的开发中复制了该约定。如果除了 setter 之外的东西应该触发绑定,那么向 Bindable 元数据标记添加事件非常有用。这在 Flex 框架中偶尔会发生; such as when an item in a list is selected thus changing the selectedIndex.但是,我想我离题了。 我同意。但是我倾向于只在需要确定事件只发送一次时才使用它。此外,有时只需在整个类上侦听 PropertyChangeEvents(使用 Bindable 标记时调度的默认事件)而不是设置 20 个单独的事件侦听器,这会非常方便。 我的处理程序监听两个属性 a 和 b 的 propertyChanged 事件,这两个属性相互影响。因此,如果设置属性 a 也会更改 b。我需要能够设置_b,而不是b。否则会陷入死循环。此外,这是一个元编程的事情,所以我希望能够为任何变量通用地创建这个过程。 getter / setter 行为需要在运行时创建,因此我无法显式定义访问器。我知道 [Bindable] 为我创建了这些附件,但我需要能够在某些情况下绕过它们。 创建一个替代方法来改变 b。传入布尔值,指定是否应调度更改事件。如果你从 b setter 调用它;设置为真;如果您从一个 setter 调用它,请将其设置为 false。这应该可以防止 propertyChange 事件调度并导致循环。或者,您可以为 A 和 B 指定相同的 Bindable 事件,然后在调度它时在您的代码中进行控制。【参考方案2】:

这个:

[Bindable] public var yummyTime:String;

同写:

 private var _yummyTime:String;
 [Bindable]
 public function get yummyTime():String
 
     return _yummyTime;
    
 public function set yummyTime(value:String):void
 
     _yummyTime = value;
 

在第二段代码中,您刚刚明确写出了私有变量的 getter 和 setter。

另请注意,[Bindable] 标签在 setter 函数中添加了一个特殊检查,如下所示:

    private var _yummyTime:String;
    [Bindable(event="yummyTimeChange")]
    public function get yummyTime():String
    
        return _yummyTime;
    

    public function set yummyTime(value:String):void
    
        if( _yummyTime !== value)
        
            _yummyTime = value;
            dispatchEvent(new Event("yummyTimeChange"));
        
    

如果您不想检查 if( _yummyTime !== value) 您可以在 [Bindable] 标记中添加自定义事件名称,就像我给出的最后一个示例一样不要写支票。

【讨论】:

我希望有一个名为 _yummyTime 的变量,但它不存在。任何访问 this['_yummyTime'] 的尝试都会导致错误。 this['_719695190yummyTime'] 可以访问。我在 bebugger 中找到了这个名字。 有这样一个变量,如果你按照我给出的第二个或最后一个例子编写它,你就可以访问它。简单地添加 [Bindable] 只会让编译器在内部使用它。如果你想出于任何原因使用它,你必须明确地为此编写代码。如果您好奇添加这样的元数据标签的结果是什么,您可以看到编译器添加编译器参数“-keep”生成的代码。

以上是关于私有属性的名称 [Binable] 生成的主要内容,如果未能解决你的问题,请参考以下文章

面向对象——封装

iOS开发 私有变量 私有属性的使用选择

如何在javascript中获取类的私有属性名称? [复制]

私有类属性

Python 之私有属性

检测对象属性是不是在 PHP 中是私有的