天天看點

淺談ActionScript3中的原型對象

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,如需轉載請自行聯系原作者