AS3 - 私有对象。将 属性 设置为只读

AS3 - Private Object. Make property as read only

我的 Class 中有一个对象 属性,它是私有的并标记为只读。

private var readOnlyObj:Object;

我只能用get方法访问它:

public function get readOnly(){ return readOnlyObj }

我可以通过以下方式访问它:

var objClass = new MyClass();
trace(objClass.readOnly)

如果我会尝试修改它:

objClass.readOnly = new Object();

我会得到一个错误:

Error# Property is read only.

现在我的问题是:

如何将 readOnlyObj 的属性设置为 read-only

如果我在构造函数中设置了对象:

readOnlyObj["property1"] = 0;

并通过以下方式修改 属性:

objClass.readOnly["property1"] = 2;

有效。我想将 property1 设置为 read-only 属性。这可能吗?谢谢!

你不能真正做到这一点,至少以你描述的方式。您当然可以将 readOnly 对象设为仅具有 read-only 属性的自定义 class 实例,但您不能冻结动态 Object 实例。

您可以通过返回原始对象的副本而不是对象本身来执行此操作。

DisplayObjectstransform属性是这样工作的:你可以从get function中得到对象属性并可以修改对象,但是这样的修改没有效果,直到您将修改后的对象传回 set function.

在你的情况下,没有办法返回对象(没有 setter)并且通过从 getter 返回一个副本(通常称为 'clone'),没有从外部修改对象的方法属性,因为返回的引用引用了新创建的独立克隆,本质上使内部对象保持不变。

你问的是不可能的,只能给出答案"no"如果另一方面你问的是如何实现该功能,那么可能会有一些答案。

首先,根据您的代码和手头的问题,很明显您误解了 class 范围。您设置:

private var readOnlyObj:Object;

为只读,但它实际上不是您要保护的对象,而是它的属性。所以 readOnlyObj 实际上应该是不可见和不可访问的。

既然 readOnlyObj 是私有的且不可访问,您可以组合一个简单的方法来检索属性:

public function getProperty(name:String):*
{
    if(readOnlyObj[name] != undefined)
    {
        return readOnlyObj[name];
    }
    return null;
}

知道如何组合一个不能在外部使用的 public setter 可能也很有用。 创建一个内部布尔变量(仅限 true 包),然后在设置 属性 之前在内部将该变量设置为 true,然后将其设置回 false。由于无法在外部设置该布尔值,因此您最终会得到一个无法在外部使用的 public setter。

internal var allowSetter:Boolean;

public function set whatever(value:*):void
{
    if(allowSetter)
    {
        //set property ect...
        allowSetter = false;
    }
}