《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

相关文章

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::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.