AS2:没有名称的财产

时间:2012-02-01 15:38:43

标签: flash actionscript actionscript-2

我使用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”的属性。

有谁知道为什么我无法访问此属性?

2 个答案:

答案 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"]);(优先于之前的数据访问,因为它为类的其余部分保留了类型安全的优点)。
  • 不要为addProperty烦恼。请改用函数样式setter / getter(getOption() / setOption())。

选择最后一个的原因:它可能不会"看起来很好" (如果addProperty实际上运行良好),但它有效,并且很容易破译代码中发生的事情。与addProperty不同,addProperty增加了一个间接级别,更有可能使您添加的属性看起来像其他人阅读您的代码一样神奇。