由于在Toolkit.checkType( )方法中用到了这个东东,因此俺找了些资料来补充说明一下!
原文地址:ActionScript。从全局属性_global property中找出那些Macromedia还未准备正式支持的好东东。
你经常想检查一个对象的属性以完成更大的目标。例如,出于调试目的,你可能想在输出面板中列出一个对象的属性。或者你可能想破译一个对象返回的未知属性,比方说,一个服务器端调用,因此你可以聪明地解析数据。当然,我们还想枚举(列出)ActionScript的隐藏属性,从中看一看我们是否可以找到些未经证实的好东东。
ActionScript基本的for...in循环可以有效地告诉Flash解释器“看一下这个感兴趣的对象,并找出它的每个属性(包括存储在属性中的方法),仅执行一次循环体。并且,当你干个不停的时候,告诉我当前属性的名字。”
然而,许多ActionScript的内建方法和属性在默认情况下通过for...in循环是不可枚举的。Macromedia假设你想看到只是在你的代码中所创建的对象和属性,而不那些用于底层支持的ActionScript,因此在通过for...in枚举时他们隐藏许多内建属性。然而,无文档的ASSetPropflags()函数可以使属性和方法可见,即使它们平时在是不可枚举的。
正如其名所示,ASSetPropFlags()允许你在ActionScript中设置属性标记。这些标记会告诉Flash Player是否在for...in循环中枚举指定的方法和属性。
你同样可以使用ASSetPropFlags( )来使你指定对象的属性和方法不可写(或者不可枚举),以防止有人在不经意间重写它们。这特别适用于在你发布的组件中所使用的全局属性,以防止与使用在同一个SWF中的其他第三方组件发生冲突。
让我们看一下它是如何工作的。
ASSetPropFlags( )采用一下形势:
ASSetPropFlags(object, properties, setTrue, setFalse) 其中:
ASSetPropFlags(object, properties, setTrue, setFalse) 其中:
object
你想检查的对象或范围。
properties
你想改变其保护标记的属性或方法。你也可以将该项设置为null,这将起到通配符的作用“全部属性”。
setTrue
一个用于指定配置标记的整数形式的二进制编码。这个整数的最后三位是最重要的,而且表示(从左至右)“重写保护”、“删除保护”、“隐藏”。例如,将setTrue设置为二进制110(十六进制06或十进制6)维持重写和删除保护,但是不隐藏通过properties所指定的属性。
setFalse
另一个整数形式的二进制编码,用起来类似setTrue,只是它将属性设置为false。setFalse二进制编码在应用setTrue之前被使用。
你想使全局_global范围的属性或方法可见,其中包含了全部内建的ActionScript类。因此我们可以在一个for...in循环中枚举ActionScript中的全部类的集合:
ASSetPropFlags(_global, null, 6, 1); 以下代码将所有的ActionScript设置为不可隐藏,然后找出所有可以找到的类:
// 将保护标记设置为110以便在_global范围内暴露每件事物
ASSetPropFlags(_global, null, 6, 1);
// 列出在_global范围内的全部对象
for (thisObject in _global) {
trace(thisObject);
}为了看一下那些类中是否有些有趣的东东,我们可以依次查看那些类的每一个属性。如果我们偶然发现prototype属性——其中保存着该类的属性和方法(无论用于ActionScript 1.0还是2.0)——查看其属性和方法将会发现一些有趣的东东藏在哪里:
// 将保护标记设置为110以便在_global范围内暴露每件事物
ASSetPropFlags(_global, null, 6, 1);
// 列出在_global范围内的全部对象
for (thisObject in _global) {
// 暴露每个对象
ASSetPropFlags(_global[thisObject], null, 6, 1);
// 显示对象名
trace("\n" + thisObject);
// 列出每个对象的属性
for (props in _global[thisObject]) {
// 显示属性名
trace(" - " + props);
// 列出在下找prototype到的子项
if (props == "prototype") {
// 暴露prototype下的子项
ASSetPropFlags(_global[thisObject].prototype, null, 6, 1);
// 列出prototype下的子项
for (protoChain in _global[thisObject].prototype) {
// 显示子项名
trace(" -- " + protoChain);
}
}
}
}将以上代码粘贴到Flash MX 2004影片的第一帧并测试影片,你会看到一个很长的显示。下面展示了String类:
ASSetPropFlags(_global, null, 6, 1); 以下代码将所有的ActionScript设置为不可隐藏,然后找出所有可以找到的类:
// 将保护标记设置为110以便在_global范围内暴露每件事物
ASSetPropFlags(_global, null, 6, 1);
// 列出在_global范围内的全部对象
for (thisObject in _global) {
trace(thisObject);
}为了看一下那些类中是否有些有趣的东东,我们可以依次查看那些类的每一个属性。如果我们偶然发现prototype属性——其中保存着该类的属性和方法(无论用于ActionScript 1.0还是2.0)——查看其属性和方法将会发现一些有趣的东东藏在哪里:
// 将保护标记设置为110以便在_global范围内暴露每件事物
ASSetPropFlags(_global, null, 6, 1);
// 列出在_global范围内的全部对象
for (thisObject in _global) {
// 暴露每个对象
ASSetPropFlags(_global[thisObject], null, 6, 1);
// 显示对象名
trace("\n" + thisObject);
// 列出每个对象的属性
for (props in _global[thisObject]) {
// 显示属性名
trace(" - " + props);
// 列出在下找prototype到的子项
if (props == "prototype") {
// 暴露prototype下的子项
ASSetPropFlags(_global[thisObject].prototype, null, 6, 1);
// 列出prototype下的子项
for (protoChain in _global[thisObject].prototype) {
// 显示子项名
trace(" -- " + protoChain);
}
}
}
}将以上代码粘贴到Flash MX 2004影片的第一帧并测试影片,你会看到一个很长的显示。下面展示了String类:
String
- fromCharCode
- __proto__
- constructor
- prototype
-- substr
-- split
-- substring
-- slice
-- lastIndexOf
-- indexOf
-- concat
-- charCodeAt
-- charAt
-- toLowerCase
-- toUpperCase
-- toString
-- valueOf
-- __proto__
-- constructor 注意,这里先列出了类方法和类属性,随后是在prototype之后缩进的实例方法和实例属性。
- fromCharCode
- __proto__
- constructor
- prototype
-- substr
-- split
-- substring
-- slice
-- lastIndexOf
-- indexOf
-- concat
-- charCodeAt
-- charAt
-- toLowerCase
-- toUpperCase
-- toString
-- valueOf
-- __proto__
-- constructor 注意,这里先列出了类方法和类属性,随后是在prototype之后缩进的实例方法和实例属性。
你可以尝试使用trace( )语句访问类中的方法和属性,看看它们会返回些什么。这里,我访问String.fromCharCode( )方法,我知道它需要一个数字参数,因为这是一个有文档说明的方法:
trace(String.fromCharCode(65)); // 显示: A
trace(String.fromCharCode(65)); // 显示: A
