关于flex编程中ActionScript3.0中的Object和Dictionary的异同

【提出问题】最近在进行Flex的编程过程中,我们需要有一个像Java的Map一样的对象去存储和取出数据,目前在ActionScript3.0里面我们有2中选择一种是Object,另外一种是用Dictionary。究竟这2种方法有什么异同呢?在用的过程当中那种的效率高一点呢?

 

【解决问题】

1、Object

Object 类位于 ActionScript 运行时 类层次结构的根处。Object 由构造函数使用 new 运算符语法创建,并且可以具有动态赋予其的属性。 也可通过赋予对象文字值来创建 Object,如下所示:

var obj:Object = {a:"foo", b:"bar"}

不声明显式基类的所有类均可扩展内置 Object 类。

Adobe Integrated Runtime 中的所有运行时类均可扩展 runtime.Object 类。

可以使用 Object 类创建关联数组 。 关键是,关联数组是 Object 类的实例,而每个键/值对由属性及属性的值表示。要将关联数组声明为 Object 数据类型还有另一个原因:您可以使用对象文本来填充关联数组(但只能在您声明它时)。下面的示例使用对象文本创建一个关联数组,使用点运算符和数组访问运 算符访问项,然后通过创建一个新属性来添加新的键/值对:

 var myAssocArray:Object = {fname:"John", lname:"Public"};
 trace(myAssocArray.fname);     // John
 trace(myAssocArray["lname"]);  // Public
 myAssocArray.initial = "Q";
 trace(myAssocArray.initial);   // Q

ActionScript 3.0 包含两种继承类型:类继承和原型继承:
  • 类继承 -- 是主要的继承机制,并支持固定属性的继承。固定属性是声明为类定义一部分的变量、常量或方法。现在,可通过存储相关类信息的特殊类对象表示每个类定义。
  • 原型继承 -- 在以前版本的 ActionScript 中是唯一的继承机制,在 ActionScript 3.0 中作为继承的替代形式。每种类都有一个关联的原型对象,而原型对象的属性由该类的所有实例共享。在创建一个类实例时,它具有对其类的原型对象的引用,这将 作为实例及与其关联的类原型对象间的链接。运行时,如果在类实例中找不到某属性,则会检查委托(该类的原型对象)中是否有该属性。如果原型对象中不包含该 属性,该过程会继续在层次结构中连续的更高级别上对原型对象进行委托检查,直至 Flash Player 找到该属性为止。

类继承和原型继承可同时存在,如下例所示:

 class A {
     var x = 1
     prototype.px = 2
 }
 dynamic class B extends A {
     var y = 3
     prototype.py = 4
 }
  
 var b = new B()
 b.x // 1 via class inheritance
 b.px // 2 via prototype inheritance from A.prototype
 b.y // 3
 b.py // 4 via prototype inheritance from B.prototype
  
 B.prototype.px = 5
 b.px // now 5 because B.prototype hides A.prototype
  
 b.px = 6
 b.px // now 6 because b hides B.prototype

用函数替代类后,可以构造自定义原型继承树。利用类,原型继承树可镜像类继承树。但是,由于原型对象是动态的,因此可以在运行时添加和删除基于原型的属性。

2、Dictionary

Dictionary 类用于创建属性的动态集合,该集合使用全等运算符 (=== ) 进行键比较。将对象用作键时,会使用对象的标识来查找对象,而不是使用在对象上调用 toString() 所返回的值。Dictionary 集合中的原始(内置)对象(例如 Number)的行为方式与它们作为常规对象的属性时的行为方式相同。
以下语句显示了一个 Dictionary 对象和一个 key 对象之间的关系:
var dict:Dictionary = new Dictionary(); var obj:Object = new Object(); var key:Object = new Object(); key.toString = function() { return "key" } dict[key] = "Letters"; obj["key"] = "Letters"; dict[key] == "Letters"; // true obj["key"] == "Letters"; // true obj[key] == "Letters"; // true because key == "key" is true because key.toString == "key" dict["key"] == "Letters"; // false because "key" === key is false delete dict[key]; //removes the key

【总结】
Dictionary 类用于创建属性的动态集合,该集合使用全等运算符 (===) 进行键比较。将对象用作键时,会使用对象的标识来查找对象,而不是使用在对象上调用 toString() 所返回的值。Dictionary 集合中的原始(内置)对象(例如 Number)的行为方式与它们作为常规对象的属性时的行为方式相同。
     Object也可以和Dictionary一样,除了使用字符串作为键外,还可以使用对象作为键,区别在于Object将调用键的toString()方 法,将返回的字符串作为键,而Dictionary则使用该引用作为键,既可以理解为该对象的内存地址作为键,因此内容相等的2个对象在Object中将 是同一个键,在Dictionary中将是不同的

你可能感兴趣的:(编程,object,Flex,actionscript,inheritance,Dictionary)