《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

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::