AS3和java等語言不同,在它裡面一切都是對象,就連類也是對象,所有的類,包括我們自己定義的任何類,他們的原型對象都是object類。
首先通過一個簡單的例子來對prototype有一個感性直覺的認識。Prototype是類中一個靜态屬性,它表示對類的原型對象的引用。
我們先來自己定義兩個滿足繼承關系的類:
public dynamic class ParentClass {}
public dynamic class ChildClass extends ParentClass {
}
然後我們在腳本中寫:
trace(ParentClass.prototype, ChildClass.prototype);
結果輸出:
[object Object] [object Object]
從這裡的結果[object Object] ,我們可以看出第一個object 代表對象,而第二個Object代表Object類,整個的意思就是說這是一個對象,他是Object類。
我們可以動态地向原型對象中添加屬性,并且在父類的prototype中添加的屬性是可以被子類所共享的,下面通過一個例子加以說明,我們在父類的prototype中加入了一個sayHello函數。然後就可以在子類中對其進行通路,與之相對的是,若我們在子類的prototype中添加函數,則其他子類是無法通路到的。即用哪個類向原型加的屬性,你就隻能用這個類調用。
複制代碼
public class ParentClass
{
prototype.sayHello = function():String
{
return "hello,ptototype";
}
}
public class ChildOne extends ParentClass
public class ChildTwo extends ParentClass
public function onCreate():void
var strInfo:String = ChildOne.prototype.sayHello();
trace(strInfo);
var str1:String = ChildTwo.prototype.sayHello();
trace(str1);
ChildOne.prototype.testFunc = function() : void
trace("just for test.");
ChildOne.prototype.test();
//ChildTwo.prototype.test();
類的執行個體跟類在原型對象上還有一點差別的,一個類的執行個體最初的原型對象都是未定義的,既不是O bject類也不是定義這個執行個體的類。也就是說當我們對一個類進行執行個體化時,這個執行個體的原型對象是未定義的。
我們對上面定義的ChildOne類進行執行個體化:
var c1:ChildOne = new ChildOne();
trace(c1.prototype);
測試輸出:
undefined
但是執行個體的prototype屬性我們可以動态給他指派,前提是類必須要是動态類。代碼如下:
var c1:ChildOne = new ChildOne();
c1.prototype = ChildTwo;
trace(c1.prototype);
[class ChildTwo]
這表明是它的原型對象是一個類, 類名為ChildTwo。
最後再補充一點關于命名空間的知識, 命名空間中可以放置函數,變量和常量,但不能放置類的定義。下面是一個簡單的命名空間的執行個體:
public namespace myspace = "http://phinecos.cnblogs.com";
myspace function myfunc():void
trace("test namespace.");
use namespace myspace;
myfunc();
myspace::myfunc();
本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2010/04/03/1703976.html,如需轉載請自行聯系原作者