Actionscript 3 在Actionscript中,是否在初始化静态常量之前调用类构造函数?
我是AS3新手,有Java背景。在AS3中,我有一个初始化的静态const对象PRESETS,并试图在构造函数中访问它,但我得到一个错误,该常量为null。在初始化常量之前是否调用了类构造函数?我希望该常量在调用构造函数之前就可以使用了。有人能解释一下这里发生了什么吗?我想试着让这一切顺利进行 我的代码如下:Actionscript 3 在Actionscript中,是否在初始化静态常量之前调用类构造函数?,actionscript-3,actionscript,Actionscript 3,Actionscript,我是AS3新手,有Java背景。在AS3中,我有一个初始化的静态const对象PRESETS,并试图在构造函数中访问它,但我得到一个错误,该常量为null。在初始化常量之前是否调用了类构造函数?我希望该常量在调用构造函数之前就可以使用了。有人能解释一下这里发生了什么吗?我想试着让这一切顺利进行 我的代码如下: public class TteColor { // This is the constant I'm trying to access from the constructor.
public class TteColor {
// This is the constant I'm trying to access from the constructor.
public static const PRESETS:Object = {
"WHITE": new TteColor("#FFFFFF"),
"BLACK": new TteColor("#000000"),
"GRAY": new TteColor("#808080"),
"RED": new TteColor("#FF0000"),
"GREEN": new TteColor("#00FF00"),
"BLUE": new TteColor("#0000FF"),
"YELLOW": new TteColor("#FFFF00"),
"CYAN": new TteColor("#00FFFF"),
"MAGENTA": new TteColor("#FF00FF")
};
public static const COLOR_REGEX:RegExp = /^#[\dA-Fa-f]{6}$/;
public var intValue:int;
public var strValue:String;
public function TteColor(color:String, defaultColor:TteColor = null) {
trace("trace0");
if (color != null && color.search(COLOR_REGEX) >= 0) {
trace("trace1");
strValue = color.toUpperCase();
intValue = uint("0x" + strValue.substring(1));
} else {
trace("trace2");
if (!defaultColor) {
trace("trace2.1");
trace("PRESETS: " + PRESETS);
defaultColor = PRESETS["WHITE"]; // PRESETS constant is still null here?
}
trace("trace3");
strValue = defaultColor.strValue;
intValue = defaultColor.intValue;
Logger.warning("Incorrect color value. Defaulting to: " + strValue);
}
}
}
输出:
输出显示预设常量为空
trace0
trace2
trace2.1
PRESETS: null
TypeError: Error #1009: Cannot access a property or method of a null object reference.
更改为静态变量
我将预设常量更改为静态变量,并静态初始化值。这本该很好用。为什么静态变量工作时常量会失败
// Statically initialize PRESETS
{
PRESETS = new Object();
PRESETS["WHITE"] = new TteColor("#FFFFFF");
PRESETS["BLACK"] = new TteColor("#000000"); PRESETS["GRAY"] = new TteColor("#808080");
PRESETS["RED"] = new TteColor("#FF0000");
PRESETS["GREEN"] = new TteColor("#00FF00");
PRESETS["BLUE"] = new TteColor("#0000FF");
PRESETS["YELLOW"] = new TteColor("#FFFF00");
PRESETS["CYAN"] = new TteColor("#00FFFF"); PRESETS["MAGENTA"] = new TteColor("#FF00FF");
}
// Changed from constant to static class variable. This works fine.
public static var PRESETS:Object;
静态成员是类本身的成员,而不是实例上的成员。因此,对静态成员的调用永远不会调用构造函数,因为您不是从类创建实例/对象,而是调用类本身的函数/成员 在调用常量之前是否调用了类构造函数 初始化 正常情况下不需要。 但您正在从静态成员中显式调用类构造函数:
"WHITE": new TteColor("#FFFFFF"),
"BLACK": new TteColor("#000000"),
// etc...
因此,当静态对象试图创建自身时,它必须运行类构造函数。在类构造函数中,您引用静态对象,该对象尚未完成自身的创建
第二个示例之所以有效,是因为您在开始调用类构造函数之前完成了对象的构造。(此时对象仍然为空,但至少它不是空的)。使用satic常量时,您试图创建同一类的对象。因此,当执行静态常量初始化时,它失败了 嗨。谢谢你的评论。我知道静电是如何工作的。也许我的描述不清楚(当我问这个问题时是凌晨4点),所以我改写了我想说的话。我希望这次天气会转晴。在第二个例子中,我知道为什么我可以访问构造函数中的静态变量,但是我对第一个例子感到困惑,在调用构造函数之前,常量没有初始化。希望我能澄清一下。哼!德普时刻就在那里。谢谢你指出这一点。