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
实例。
您可以通过返回原始对象的副本而不是对象本身来执行此操作。
DisplayObjects
的transform
属性是这样工作的:你可以从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;
}
}
我的 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
实例。
您可以通过返回原始对象的副本而不是对象本身来执行此操作。
DisplayObjects
的transform
属性是这样工作的:你可以从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;
}
}