Object class 是所有類的基類,所有未申明繼承的class都被默認的繼承自Object class,如number,string等基本類型都是繼承自Object類。甚至prototype,Class,Function等類都是繼承自Object類,當然這些類雖然繼承自Object類,但是還是不能當做普通的類一樣操作。
一.Object的創建
可以使用關鍵字new 來創建Object 實例,並且可以給他們動態的賦值。
var obj:Object = new Object(); obj.a = "foo"; obj["b"] = "bar"; trace(obj.a); trace(obj.b);
同時Object 實例可以按照下面的方式創建。
var obj:Object = {a:"foo", b:"bar"} trace(obj.a); trace(obj.b);
當一個類被聲明為dynamic時,它就能被動態賦值,否則不能動態賦值。
public class A { public function A() { } } var obj:A = new A(); obj.a = "foo"; //error obj.b = "bar"; //error public dynamic class A { public function A() { } } var obj:A = new A(); obj.a = "foo";//right obj.b = "bar";//right trace(obj.a); trace(obj.b);
二.prototype的使用
一個類的prototype對象是該對象的一個特殊的對象,它提供了一個機制用來讓該類的所有對象共享該值。在編譯程序的時候,當一個屬性不能被在一個類的實例上找到的時候,編譯器就會從代理(也就是類的prototype對象)上尋找該屬性。如果那個prototype不含有那個屬性,那么編譯器就會繼續從更高級別的類的prototype對象來尋找該屬性。
prototype和class的繼承和訪問有如下特性:
1.class自有的屬性和方法在聲明為static時只能被類使用,不能被對象使用,且不支持繼承。
2.class自有的屬性和方法在不聲明為static時只能被對象使用,不能被類使用,支持繼承,屬性不能被重定義,方法如果要被重定義需要加上override。
3.prototype的屬性和方法可以被類使用也可以被對象使用,且都支持繼承。被對象使用時,類需要定義成dynamic的,否則無法通過對象使用。被類使用時需要以class.prototype.property的形式使用不能直接使用。
public dynamic class A { public var x:String = "x in A"; public static var staticx:String = "staticx in A"; prototype.px = "px in A"; prototype.py = "py only in A"; public function A() { } public function toLocaleString():String { return "a locale string in A"; } public static function staticFunc():String { return "a static function in A"; } public function thefunc():String { return "a func in A"; } } public dynamic class B extends A { var x:String = "x in B"; //cannot redefine public static var staticx:String = "staticx in B"; prototype.px = "px in B"; public function B() { } public function toString():String { return "a string in B"; } public static function staticFunc():String { return "a static function in B"; } public override function thefunc():String { return "a func in B"; } } var ma:A = new A(); var mb:B = new B(); trace(A.staticx); trace(B.staticx); trace(ma.staticx); //undefined trace(A.staticFunc()); trace(B.staticFunc()); trace(ma.staticFunc()); //error trace(A.x); //error trace(ma.x); trace(mb.x); trace(ma.thefunc()); trace(mb.thefunc()); trace(ma.px); trace(mb.px); trace(mb.py); trace(A.prototype.px); trace(B.prototype.px); trace(B.prototype.py); trace(ma.toLocaleString()); trace(mb.toLocaleString()); trace(ma.toString()); trace(mb.toString()); trace(A.prototype.toString()); trace(B.prototype.toString());
三.Object的一些屬性和方法說明
共有屬性
constructor:Object
指向Object class或者Object實例的構造函數
prototype:Object [static]
指向Object Class 或者Function Object 的原型(prototype)
公共方法
Object()
創建一個Object實例,並且使該實例的constructor property指向其構造函數。
hasOwnProperty(name:String):Boolean
判斷是否有具有該名稱的property,對於靜態的屬性和方法和prototype得到的屬性或方法會返回false
isPrototypeOf(theClass:Object):Boolean
判斷一個對象是否在指定的對象的原型鏈中
propertyIsEnumerable(name:String):Boolean
判斷一個指定的屬性是否存在並是否可列舉
toLocaleString():String
返回一個代表該對象的locale-specific conventions字符串
toString() :String
返回一個代表該對象的字符串
valueOf():Object
返回對象的原始值
四.Class類
Class繼承自Object,是一個特殊的類,用Class類可以實現更靈活的代碼,如下例:
public dynamic class A { public function A() { } public function toString():String { return "A class" } } public dynamic class B { public function B() { } public function toString():String { return "B class" } } var cls:Object = { "A":A as Class, "B":B as Class }; public function CreateClass(type:String) { var myclass:Class = cls[type]; return new myclass(); } var newobj = CreateClass("A"); trace(newobj.toString());
五.Function類
Function類繼承自Object,是一個特殊的類,他有call和apply兩個方法,這兩個方法的基本功能是一樣的,區別就在apply中將函數所有參數以數組的形式傳入,而call則是用逗號分隔開來傳入,使用function可以實現更靈活的代碼,如下例:
public dynamic class A { var ininum:int = 0; public function A() { } } var arr:Array = new Array(1, 2, 3); var obj:Object = new Object(); obj.sumup = function(num1:int,num2:int,num3:int):int { return this.ininum + num1 + num2 + num3; } var sum1:A = new A(); var sum2:A = new A(); sum2.ininum = 100; trace(obj.sumup.apply(sum1, arr)); trace(obj.sumup.call(sum1, 1, 2, 3)); trace(obj.sumup.apply(sum2, arr));
六.幾種基本類
int,uint,number是繼承自Object,用來顯示數字的三種類:
它們主要實現了toExponential(轉為指數形式),toFixed(指定寬度),toPrecision(指定精確度)這三個函數
String用來顯示字符串
Boolean用來判斷是非等
Date用來處理時間
Math用來做計算,這個類不能構建對象,所有的操作都是基於類而不是對象進行的。
這些內置類都是按照值傳遞的,且被聲明為final型類,也就是不能再被繼承了。