as3中属性访问原理(转)
来源:互联网 发布:mac推出是什么意思 编辑:程序博客网 时间:2024/05/16 09:58
转自http://www.laaan.cn/?p=1493
今天写代码,发现一个问题:
然后我在另一个类里面,这样操作:
var value = new B().test(new B());trace(value);
竟然能输出B实例的私有变量doo。doo这个变量所在的namespace应该是当前实例中——也就是说是有当前实例中才能访问该属性。但是很不幸,测试证明在其他B的实例中也能访问。于是想到as3中属性访问的原理:MultiName。
在as3中,访问属性是通过MultiName来实现的。最基本的情况这样的:MultiName包含两个数据段,一个是name,一个namespace。当你访问一个对象的属性时,会通过name来查找该对象的属性,如果该属性名等于name,而且该属性的namespace和MultiName中的namespace也相等的话,就认为该属性就是该MultiName要访问的属性了。
我看了下swf的结构,在B类的test方法中,target.doo编译后生成的指令中,访问属性doo的MultiName中的namespace和B类中属性doo的namesapce相同。这样的话,上面这个例子就可以理解了。
接下来,我做了一个测试:
//在别类中,直接新建一个B实例,直接访问doo1。通过非严格模式编译var b:B = new B();trace(b.doo);
运行的结果当然会报找不到doo属性的错误。因为b.doo编译后所生成的查找doo的MultiName中所包含的namespace和和B类中doo属性的namespace不相等(name数据是相等的)。于是我将B类中doo属性的namespace直接注入到查找doo的MultiName中去。然后重新组合swf——整个世界终于清静了。
既然原理确实是这样的,我就想到是不是可以提供一个方法专门用来访问对象的私有属性呢,比如:
function getPrivate(obj:*, pro:String):*
{return obj[pro];}
这个想法纠结了我一个下午,最后的结论是:不可能——至少我没想到有方法可以的。主要原始是:私有属性的namespace必须是和查找MultiName中的namespace在内存中的地址一样才能访问——我尝试保持数据一样但是内存地址不一样,失败了。
联想到一个动态属性访问的问题。动态访问属性时所使用的MultiName,不包含namespace数据段,但是有一个namespace set数据段,里面包含当前域能访问的所有namespace。这样,在查找属性时,得来一个循环来比对,会消耗更多的资源。
- as3中属性访问原理(转)
- AS3中属性关键字
- as3之访问XML元素和属性
- AS3 中 class 的属性
- AS3 中Label相关属性的设置
- as3中DisplayObject对象的rotation属性
- as3.0 中target属性和currentTarget属性的区别
- Vue双向绑定原理(二)访问器属性defineProperty()
- 【转】as3中手工创建的MC如何访问父级变量及函数
- AS3中汉字转拼音
- as3 中使用类属性的两种方式:
- AS3中DisplayObject属性在Matrix中的计算方式
- as3 flex 中经常用的一些htmlText属性
- AS3.0中实例的name属性和实…
- AS3访问AMFPHP
- AS3 mouseEnable mouseChildren属性
- AS3 alpha visible属性
- AS3 mouseEnable mouseChildren属性
- dedecms 最简单 增删查
- Javascript 刷新框架及页面的方法
- 最新nod32 for windows2003
- 苦恼啊!!!!!!!!!!!11
- redirect和forward
- as3中属性访问原理(转)
- 从菜鸟到战斗机的过程
- Java与模式笔记(23)
- 差分约束
- hibernate pojo类 实现serializable接口
- Java与模式笔记(24)
- error_reporting函数 详细说明
- [转]IT业10大影响并购:英特尔收购McAfee被担忧
- FLASH向量教程