自MXMLC compiler doesn't support mixed access modifiers for setters/getters以来,我想知道是否从setter类的内部或外部调用了公共setter函数。这种方法应该允许我维护公共财产,但具有更高的安全性,例如公共/私人混合访问。
是否可以使用参数'callee属性,或者其他可能来确定setter是从setter的类内部设置还是从外部设置?
这是我的意思的一个例子:
package
{
//Class
public class MyLocation
{
//Constants
public static const LOCATION_LEFT:String = "locationLeft";
public static const LOCATION_RIGHT:String = "locationRight";
//Properties
private var sideLocationProperty:String;
//Constructor
public function MyLocation(sideLocation:String = MyLocation.LOCATION_LEFT)
{
this.sideLocation = sideLocation;
trace(sideLocation);
}
//Texture Panel Is Collapsed Setter
public function set sideLocation(value:String):void
{
if (value != LOCATION_LEFT && value != LOCATION_RIGHT && value != LOCATION_AUTO)
throw new ArgumentError("\"MyLocation set sideLocation(value:String)\" – value parameter is not supported.");
sideLocationProperty = value;
//pseudo code
if (arguments.callee is from MyLocation)
trace("sideLocation was set internally");
else
trace("sideLocation was set externally");
}
//Texture Panel Is Collapsed Getter
public function get sideLocation():String
{
return sideLocationProperty;
}
}
}
答案 0 :(得分:3)
很可能你不能这样做。
你为什么不写
public function setSideLocation(value:String, caller:* = null):void
那么你可以做任何你想做的事情,比如
trace(caller is MovieClip);
或caller.hasOwnProperty(something)
等
通过将其设置为null作为默认值,您甚至不需要使用它。只是可选。
所以从另一个对象调用它:
object.setSideLocation("something", this);
还要保持一致写
public function getSideLocation():String
。
答案 1 :(得分:2)
不,不可能。
另外,这是一个非常糟糕的主意。尽量保持你的代码没有副作用,即。你不应该编写故意或意外执行的代码,因为调用者的类。想象一下尝试对这样的代码进行单元测试 - 噩梦。
答案 2 :(得分:0)
是的,AS3的getter和setter已经足够灵活,可以很容易地编写难以理解的代码,因为它们会产生意想不到的副作用,而这个想法只会让它变得更加混乱。 getter或setter的重点是提供一个受控的公共访问点 - 不需要从可以访问私有成员的类中调用getter或setter。
答案 3 :(得分:0)
这是一个老问题,但如果其他人正在寻找...尝试以下内容并解析堆栈跟踪以获取调用者
trace(new Error()。getStackTrace())