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型類,也就是不能再被繼承了。
