我的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
属性。这可能吗?谢谢!
答案 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
实例。