(转)AS3函数动态添加实例属性
var shot:Function=function():void{
shot['times']++;
trace("shot():times:"+shot['times']);
}
shot['times']=0;
shot();
//为什么里面的shot['times']改为shot.times时就不行了。shot['times']是不是叫用到了数组运算符?
//数组运算符除了在程序运行时需要访问一个成员,而这个成员的名字到了运行时才会知道的情况下还有哪个情况下需要用?
var shot:Function=function():void{
shot.times++;
trace("shot():times:"+shot.times);
}
shot.times=0;
shot();
为什么是错的?
//基于内存性能的考虑, as3.0中大部分类都是密封类,不能动态添加属性的(既然不能动态添加 就当然不能动态访问了)
比如:
var s:String = "abc";
s.tt = 123; //这里肯定报错
//场景 1, 图层'图层 1', 帧 1,3 行 1119: 访问可能未定义的属性 tt (通过 static 类型 String 引用)。
但也有例外,比如MovieClip(影片剪辑) 或者 Object 或者 Function ,根据统计,as3中有几个类是动态类来的
Error
RegExp
Date
Function
Class
Array
MovieClip
这些都是动态类,可以动态添加属性
加是可以加了,但加也有一定规则,需要使用数组访问符来加 和 访问
亦即是下面说的
数组访问符有两种作用
1. 动态设置属性
2. 动态获取属性(相对意义上的动态)
不能使用点语法 . ,要使用数组访问符 ,但有一个例外,MovieClip是可以直接使用点语法来访问动态属性
如:
var d:Date = new Date();
d.a = 1; //报错
d["a"] = 1; //正常编译
//其它动态类只能使用数组访问符
但
var m:MovieClip = new MovieClip();
m.a = 1; //正常编译m["a"] = 1; //正常编译
//MovieClip 两种均可
这个是第一点,动态设置
关于第二点,动态访问,道理一样,不能使用点语法,所以要用数组访问符,
另外一个作用就是批量访问对象,比如你场景中建了十个影片剪辑 给它们的实例名分别是 mc1 mc2 mc3 ...... mc9 mc10
这种有规律 (mc + 数字)的命名时,如果我想批量为它们添加鼠标事件的话 就可以用数组访问符
- for(var i:uint=1;i<10;i++){
- this["mc" + i].addEventListener(MouseEvent.CLICK,onClick_func);
- }
- function onClick_func(_evt:MouseEvent):void{
- trace(_evt.target.name);
- }
复制代码
因为你不能用 "mc" + i .addEventListener(MouseEvent.CLICK,onClick_func);
"mc" + i 不是一个对象 ,你要作为对象访问 必须使用 类似 this["mc" + i] 这样的语法来获取对象
至于楼主两次提到的应用环境,在面向对象编程中,一般不提倡使用动态属性,
多数时间是习惯了as2.0编程的人,习惯了as2全部动态类,喜欢加啥就加啥 喜欢怎么加就怎么加时使用,一般有了一定编程经验的as3.0人员一般少用
比如
- for(var i:uint=1;i<5;i++){
- this["a" + i].id = i;
- this["a" + i].addEventListener(MouseEvent.CLICK,onClick_func);
- }
- function onClick_func(_evt:MouseEvent):void{
- switch(_evt.target.id){
- case 1:
- trace("首页");
- break;
- case 2:
- trace("产品信息");
- break;
- case 3:
- trace("公司文化");
- break;
- case 4:
- trace("关于我们");
- break;
- }
- }
复制代码
通过添加一个id的动态属性 用来在事件处理函数中识别区分点的是哪一个按钮
一般多数是这样使用 ,其它使用就是像我上面说的 通过字符组合出的对象名 动态获取一个对象的引用
下面这段我本来想回复楼主的 但写着写着感觉 又长又臭 就不续了 大概意思个就是了
数组访问符有两种作用
1. 动态设置属性
2. 动态获取属性(相对意义上的动态)动态与静态是相对的概念,在计算机概念上,编译文件的时候(即按下ctrl+Enter时),编译器(你不懂的话,先可以理解成flash软件)会先对源代码中 声明的对象 属性 方法 以及场景中所有对象
(比如一个图片 它其实是一个bitmap对象 一个影片剪辑 它其实还是一个MovieClip对象 只不过存在于场景中 显示出来罢了 实际在文件内部它还是识别为一个对象)编译器会对这些已经存在的对象作一次点名,并把它们记录在一个“列表”中(这个列表是 flashPlayer底层自动维护的 我们不用理)
因为这个表已经记录在案所有编译阶段已经声明的对象,程序使用它们的时候 ,就可以在这个列表中查找说到这里 不得不说一下内存空间的事情了
因为不同的数据类型 它们在内存中都有一定的固定字节长度 编译阶段已经声明的对象 运行时内存空间就已经申请好了
不会频繁向系统申请内存了 (系统的内存不是你想要就要 它像一个停车场 需要调度才可以腾位置的 太多的空位间隔 就要把车移动腾在一起 以整理出大空地(内存)) 这个腾空间的概念 差不多就是内存整理 ,需要浪费一定的系统资源的所以说静态编译的对象 会相对省系统资源 ,这个也是as3.0中大部分类都默认为密封类(即不能随便添加动态属性)的原因了
上面这段是解释为什么不能用 .属性 来添加 动态属性 的原因,as3中大部分对象都是密封类,不能直接使用 .属性 来添加
(转)AS3函数动态添加实例属性相关推荐
- python 类装饰器和继承_python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)...
介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. 1 #coding= ...
- react 动态添加组件属性_这么高质量React面试题(含答案),看到就是赚到了!...
前言 本文篇幅较长,全是干货,建议亲们可以先收藏慢慢看哦 写文不易,欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持! Q1 :什么是虚拟DOM? 难度::star: 虚拟DOM(VDOM)它是 ...
- vue 动态添加html属性,vue.set如何添加属性?
在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官方文档定义 ...
- js 对象动态添加/设置属性名和属性值
访问对象属性一共有两种方法:点获取法和方括号获取法. 有一个对象 Obj = {"Name":"xiaoming","AGE":" ...
- js 动态添加 disabled 属性
如: *方式一: <div id = "NB"> </div> if( a ) {// 符合条件 a 移除 disabled 属性$('#NB').remo ...
- java动态删除属性值_JavaBean动态添加删除属性
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.cglib BeanGenerator beanGenerator = new BeanGenerator(); beanGenerator.addP ...
- react 动态添加组件属性_React的组件动态参数使用Underscore和Context来传递
通常情况下,子组件明确地知道从props中传入的属性,甚至要对传入的属性进行限定.但父组件向子组件传递参数时,有时参数名称是作为变量出现的,无法预先明确下来,这就是动态的参数传递.动态参数传递的方法是 ...
- android动态添加布局属性 layoutparmas,Android 代码动态布局 LayoutParams 使用
先来看一个简单的布局,先用xml写 xmlns:tools="http://schemas.android.com/tools" android:layout_width=&quo ...
- jQuery动态添加.active属性实现按钮点击样式
想实现如图效果,设置好了按钮的不同状态样式,想在点击某个按钮后保存.active的样式,其他的恢复默认样式: 代码: <a id="01B7654321" >选中按钮样 ...
最新文章
- Ruby中,:(ampersand colon)的用法
- Qt智能指针--QSharedPointer
- 旅行商问题动态规划matlab,旅行商问题的解法
- 使用javassist动态注入代码
- Iometer 性能测试:理论/应用性能测试
- c远程连接mysql数据库_MySQL数据库远程连接开启方法
- 如何使用python导入mat格式的数据并整理
- 工作总结5:插槽的使用
- 前端学习(1650):前端系列实战课程之字符串常用方法
- 【git系列】github同步原作者代码
- SQL检索MongoDB的轻量级解决方案
- 代码生成器集合(整理)
- JMeter入门教程
- unity 获取屏幕角坐标_Unity3D世界坐标与屏幕坐标
- 東京音頭 (东京音头) 歌词翻译
- 在哪里能看到计算机缓存大小,怎么查看电脑硬盘缓存大小
- 用卷积神经网络(CNN)识别文字
- 抖音短视频数据抓取实战系列(九)——自动化Appium的环境与参数配置
- 存储管理——段式存储管理
- OLT基本操作及ONU的认证