我使用addProperty()
动态填充带有getter的Class。以下是我的代码片段:
for (var i in options)
{
this.addProperty(i, getOption, null);
this._optionCount++;
}
//a little while later....
public function getOption()
{
return "hellO";
}
这是成功的,因为当我从时间轴调用以下内容时(以前的代码是名为DropDown的类的一部分):
var options:Object = new Object();
options.one = "hello";
options.two = "goodday";
options.three = "yo";
options.four= "MEGA AMAZING";
options.five= "yo yo yo";
var drop1:DropDown = new DropDown(this.drop1, "red", options)
尝试通过以下方式追踪var drop1
中的所有属性:
for (var i in drop1)
trace(i+" = "+drop1[i]);
我得到以下内容:
_initY = -107
_mask = _level0.drop1.mask
_dropdown = _level0.drop1.options
_optionWidth = 143
_button = _level0.drop1
one = hellO
two = hellO
three = hellO
four = hellO
_optionCount = 5
five = hellO
_shadow = 8330268
_highlight = 9249057
然而,当我试图追踪以下内容时:
trace(drop1.one);
它给我一个编译器错误说:
没有名称为“one”的属性。
有谁知道为什么我无法访问此属性?
答案 0 :(得分:0)
您想要查看AsSetPropertyFlags以及如何设置可枚举的属性。但是,我不会按照你的方式去做,相反,我会有setOption(选项)和getOption(选项)函数 - 更少的代码,更少的间接,更少的默默无闻。最糟糕的情况是,我会在班上实现__resolve()。
顺便说一句,如果你在类中编写AS2,那么查看更好的编译器(MTASC或FLASC)可能是有意义的,那么你似乎正在使用它。
答案 1 :(得分:0)
只是一个猜测 - 自从我使用AS2以来已经很久了。
在AS2中声明类型的那一刻,编译器认为它知道该类型的所有内容。它查看了类声明并将其作为福音。这意味着,它不允许您分配给类声明中不属于的属性。
据我所知,你并不是唯一一个陷入AS2陷阱的人。有一些类在每个Flash版本附带的内部类声明中缺少方法或属性。这意味着您无法以类型安全的方式访问它们。
没有非常好的解决方案,但有一些解决方法,尽管它们都是关于删除您尝试执行的类型安全性。按照(我)的偏好顺序,从更糟到更好:
var drop1 = new DropDown(this.drop1, "red", options);
应该有效。dynamic public class DropDown() ...
(当然也可以摆脱类型安全性)trace(drop1["one"]);
(优先于之前的数据访问,因为它为类的其余部分保留了类型安全的优点)。getOption()
/ setOption()
)。选择最后一个的原因:它可能不会"看起来很好" (如果addProperty实际上运行良好),但它有效,并且很容易破译代码中发生的事情。与addProperty不同,addProperty增加了一个间接级别,更有可能使您添加的属性看起来像其他人阅读您的代码一样神奇。