《As3 Expert》_1 :数组操作符的用途,如何访问不可访问的东东?

2024-01-05 19:18

本文主要是介绍《As3 Expert》_1 :数组操作符的用途,如何访问不可访问的东东?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OOOOOXXXXXXXXX

原帖子地址:http://bbs.9ria.com/thread-53665-1-1.html

As3是强类型语言,如果访问当前上下文环境中不可访问的变量、属性或方法,编译器会报错,虽然被访问的对象实是际存在的。那么如何跳过这种检查呢?

一、数组访问操作符的三个功能

首先,大家都同意[]是一个操作符,Adobe给它起的名字叫做Array Access Operator,译为中文为数组访问操作符,顾名思义它具有以指定下标数字访问数组元素的能力,如arr1[0]、arr1[1],这与在其它高级编程语言中看到的一样。但实际上它的功能绝不仅仅在此,单从字面或者依据其它语言的经验理解会使我们在无意中小看了它。
除了可以访问数组元素,它还可以由编译器代译为new Array(),这使实例化数组的代码更为简洁方便,例如:

  1. var arr :Array = ["as3","expert","programming","by","sban"];
  2. var arr :Array = new Array(“as3″,”expert”,”programming”,”by”,”sban”); //
复制代码


除非不了解[],不然我不相信有人会如此行码
使用[]实例化数组已经成为圈内公共的AS3最佳实践之一。下面书归正传,让我们看看数组访问操作符的第三个功能,如何访问不可访问的变量、属性或方法?

二、案例

假设我们有三个项目A、B和C,其中A为As3 Library项目,B为Flex Web项目,C为Flex AIR项目,B与C均引用了项目A。在项目A某处,我们在加载资源时使用了 LoaderContext对象,这个对象有一个可读写属性叫做allowLoadBytesCodeExecution,由于某种原因我必须把这个属性设置为true,代码如下:

  1. var lc :LoaderContext = new LoaderContext();
  2. lc.allowLoadBytesCodeExecution = true;
复制代码


这两行代码是编译不过去的!原因在于allowLoadBytesCodeExecution是AIR Only属性,如果不是AIR项目,它在FB代码视图下根本就是不可见的。怎么解决?使用数组访问操作符:

  1. var lc :LoaderContext = new LoaderContext();
  2. lc['allowLoadBytesCodeExecution'] = true;
复制代码


由此可见,allowLoadBytesCodeExecution属性在源码中并不是不存在,仅是FB与编译器在非AIR项目中屏蔽了它,限制你去使用。我们不妨推测,Adobe使用了同一套代码维护了两个播放器,它们并不是完全分开的。
类似的情况在Flex SDK中还有许多。

三、总结

数组访问操作符[]的三个用途:
1,返回指定下标的数组元素(地球人都知道了)
2,简写代码,代替new Array实例化数组,返回引用
3,避开编译器检查,访问不可访问的变量、属性或方法

四、最佳实践

1,使用操作符[]实例化数组
2,除非没有别的办法了,不用乐于使用数组访问操作符访问隐藏的变量、属性或方法, 它使你的代码不可追踪难以阅读,同时避开的编译器强类型检查可能会使你的项目具有某个不可预知的隐患。对于数组访问操作符的第三个用途,你应当审慎的对待。

五、思考与练习

1,设有对象fruit1具有属性tradePrice,sellPrice,count等整形可读写属性,如何在不确定属性名称的情况下改变其属性值?
2,如何使用操作[]调用不可调用的内部方法?

sban 2008/4/1 北京。本文属于《 AS3 Expert》的一部分,转载请注明 作者及 出处,非商用。

这篇关于《As3 Expert》_1 :数组操作符的用途,如何访问不可访问的东东?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573890

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[