您的位置:首页 > 产品设计 > UI/UE

浅谈Flex唯一标识UID

2013-01-22 13:22 190 查看
浅谈Flex唯一标识UID

UID作为Flex的唯一标识,很多对象中都拥有mx_internal_uid属性,先看看代码:

<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx"

minWidth="955" minHeight="600">

<s:layout>

<s:VerticalLayout />

</s:layout>

<fx:Script>

<![CDATA[

import mx.controls.Alert;

import mx.utils.ObjectUtil;

import mx.utils.UIDUtil;

private var _arr:Array = ["a", "b"];

private var _obj:Object = {"a": "b"};

private function infoA():void{

alert(_arr + "", "a,b");

}

private function infoB():void{

_arr.push(_obj);

alert(_arr[2], _obj)

}

private function infoC():void{

var u:Number = _arr.length - 1;

_arr.pop();

alert(_arr.length, u);

alert(1, 1.00);

}

private function infoD():void{

var _newArr:Array = _arr;

var _oldArr:Array = _arr;

_newArr.pop();

alert(_newArr, _oldArr);

alert(btn.stage, stage);

}

private function infoE():void{

alert(null, undefined);

}

private function infoF():void{

alert(ObjectUtil.clone(_arr), _arr);

}

private function infoG():void{

//alert(ObjectUtil.copy(_arr), _arr);

var _newArr:Object = ObjectUtil.copy(_arr);

alert(_newArr, _arr);

_arr.pop();

alert(_newArr, _arr);

alert(_newArr.length, _arr.length);

}

private function alert(oA:Object, oB:Object):void{

var _strA:String = UIDUtil.getUID(oA);

var _strB:String = UIDUtil.getUID(oB);

Alert.show(_strA + "\n" + _strB + "\n" + (_strA == _strB));

}

]]>

</fx:Script>

<s:Button label="方案A" click="infoA()" />

<s:Button label="方案B" click="infoB()" />

<s:Button label="方案C" click="infoC()" />

<s:Button label="方案D" click="infoD()" />

<s:Button label="方案E" click="infoE()" />

<s:Button label="方案F" click="infoF()" />

<s:Button id="btn" label="方案G" click="infoG()" />

</s:Application>

方案A中 结果返回true

_arr + ""和_arr.toString()从对比上讲是一个意思,因此两者的结果是相同的,明显的两个字符串的地址不一样,但通过判断返回true,说明两者的唯一标识相同。

方案B中 结果返回true

返回的结果说明 两个对象唯一标识相同 对象在数组中估计是引用而已。

方案C中 结果都是返回true

返回结果说明 数字类型的唯一标识是统一的,不管怎么变化,都是唯一的数字而已。

方案D中 结果返回true

引用相同,唯一标识相同。

方案E中 结果返回true

程序会将其强行转换为"null"字符串,那么其唯一标识就是"null"。

方案F中 如果首先选取这个方案,结果会先为false后为true,如果先前选择了以上方案,那么会直接为true

首先说明ObjectUtil.clone方法不会克隆没有唯一标志的对象,估计是在UIDUtil.getUID方法的时候为其装配了唯一标志,所以在第二次选取的时候,唯一标识就相同了。

方案G中 同方案F一样,需要第一次选取,其中有一段被注释掉了,取消注释则返回值为false true true false,如果注释代码则返回值为false false false

结果有点怪,估计是这样的,在取消注释时,_arr中是没有唯一标识的,从方案F可以大概证明,经过UIDUtil.getUID方法后,加入了唯一标识,因此在第二次拷贝时,由于唯一标识相同,而返回true,因为是对象拷贝,而且对象的唯一标识是相同的,但又因对象已经被分割成两个地址,所以最后判断为false;当注释代码后,由于其被拷贝的对象没有唯一标识,因而返回false,在ObjectUtil.copy之前对象唯一标识没有进行统一,所以第二次对比也为false,说明生成了不同的唯一标识,当然最后结果也为false。

总结:

1. 对象 + ""和对象.toString()的唯一标识是相同的。

2. 对象在被引用和引用中的唯一标识都是相同的。

3. 数字在任何地方的使用对其唯一标识都是相同的。(2和2.00相同)

4. null和undefined在唯一标识上都是"null"。

5. ObjectUtil.clone方法不会克隆没有唯一标识的对象。

6. UIDUtil.getUID会为对象自动装配唯一标识。

7. 对象在没有唯一标识的情况下被ObjectUtil.copy会生成两个不同的唯一标识对象。

8. 反之,对象在有唯一标识的情况下被ObjectUtil.copy生成的对象也有相同的唯一标识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息