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

时间:2016-01-04 13:54:32

标签: class actionscript-3 properties readonly

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

private var readOnlyObj:Object;

我只能使用get方法访问它:

public function get readOnly(){ return readOnlyObj }

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

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

如果我试着修改它:

objClass.readOnly = new Object();

我会收到错误:

  

错误#属性是只读的。

现在我的问题是:

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

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

readOnlyObj["property1"] = 0;

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

objClass.readOnly["property1"] = 2;

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

3 个答案:

答案 0 :(得分:1)

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

transform的{​​{1}}属性的工作方式如下:您可以从DisplayObjects获取对象属性并修改对象,但是这样的修改在您传递修改后才会生效反对get function

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

答案 1 :(得分:1)

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

首先,鉴于你的代码和手头的问题很明显,你误解了类的范围。你设置:

private var readOnlyObj:Object;

只读它虽然它不是你想要保护的对象,但它的属性。因此,readOnlyObj甚至不应该是可见的和可访问的。

既然readOnlyObj是私有的且无法访问,您可以将一个简单的方法放在一起来检索属性:

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

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

internal var allowSetter:Boolean;

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

答案 2 :(得分:0)

至少在你描述的方式中,你无法做到这一点。您当然可以将readOnly对象设为只具有只读属性的自定义类实例,但不能冻结动态Object实例。