-
Notifications
You must be signed in to change notification settings - Fork 5
/
ObjectUtil.as
140 lines (127 loc) · 3.66 KB
/
ObjectUtil.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.litefeel.utils
{
import flash.net.getClassByAlias;
import flash.net.registerClassAlias;
import flash.utils.ByteArray;
import flash.utils.describeType;
import flash.utils.getQualifiedClassName;
/**
* 欢迎访问我的博客
* www.litefeel.com
* lite3@qq.com
* @author lite3
*/
public class ObjectUtil
{
/**
* 深复制一个对象<br/>
* 对象深度复制 : 将实例及子实例的所有成员(属性和方法, 静态的除外)都复制一遍, (引用要重新分配空间!)<br/>
*
* 局限性 :
* 1. 不能对显示对象进行复制
* 2. obj的必须有默认构造函数(参数个数为0,或都有默认值)
* 3. obj 里有obj类型 之外 的非内置数据类型时, 返回类型将不确定
*
*
* @param obj <b> * </b> 深复制的对象
* @return
*/
static public function deepClone(obj:*):*
{
var aliasClass:Class;
var classDefinition:Class = Object(obj).constructor as Class;
var className:String = getQualifiedClassName(obj);
// 获取已注册 obj的类名的类型
try {
aliasClass = getClassByAlias(className);
}catch (err:Error) { }
// 没有注册 AliasName
if (!aliasClass)
{
registerClassAlias(className, classDefinition);
}
// 已经注册了 AliasName ,且不是它的全类名,要重新注册个
else if (aliasClass != classDefinition)
{
registerClassAlias(className +":/:" + className, classDefinition);
}
//else
// 注册的AliasName 为 全类名
var byteArray:ByteArray = new ByteArray();
byteArray.writeObject(obj);
byteArray.position = 0;
return byteArray.readObject();
}
/**
* 浅复制一个对象<br/>
* 对象浅度复制 : 将实例及子实例的所有成员(属性和方法, 静态的除外)都复制一遍, (引用不必重新分配空间!)
*
* @param obj
* @return
*/
static public function clone(obj:*):*
{
if (obj == null
|| obj is Class
|| obj is Function
|| isPrimitiveType(obj))
{
return obj;
}
var xml:XML = describeType(obj);
var o:* = new (Object(obj).constructor as Class);
// clone var variables
for each(var key:XML in xml.variable)
{
o[key.@name] = obj[key.@name];
}
// clone getter setter, if the accessor is "readwrite" then set this accessor.
for each(key in xml.accessor)
{
if("readwrite" == key.@access)
o[key.@name] = obj[key.@name];
}
// clone dynamic variables
for (var k:String in obj)
{
o[k] = obj[k];
}
return o;
}
/**
* 测试是否为原始类型 , Booelan, Number, String
* @param o
* @return
*/
static public function isPrimitiveType(o:*):Boolean
{
return o is Boolean || o is Number || o is String;
}
/**
* 判断两个对象是否相等<br/>
* 此方法不考虑引用地址是否相同(包括属性的引用地址),只考虑值是否相等<br/>
* 此方法不考虑类型信息(自定义类型和Object将区分,自定义类型与自定义类型不区分), 例如int, Number只要值相等,那么就相等.<br/>
* 如果registerClassAlias注册类别名,将区别类型信息,但int Number依然不区分类型信息.<br/>
* 建议判断的类型信息都相同<br/>
* @param a
* @param b
* @return
*/
static public function equals(a:*, b:*):Boolean
{
var ba:ByteArray = new ByteArray();
ba.writeObject(a);
var bb:ByteArray = new ByteArray();
bb.writeObject(b);
var len:uint = ba.length;
if(bb.length != len) return false;
ba.position = 0;
bb.position = 0;
for(var i:int = 0; i < len; i++)
{
if(ba.readByte() != bb.readByte())return false;
}
return true;
}
}
}