AS3java等语言不同,在它里面一切都是对象,就连类也是对象,所有的类,包括我们自己定义的任何类,他们的原型对象都是object类。

         首先通过一个简单的例子来对prototype有一个感性直观的认识。Prototype是类中一个静态属性,它表示对类的原型对象的引用。

我们先来自己定义两个满足继承关系的类:

  1. public dynamic class ParentClass {}  
  2. public dynamic class ChildClass extends ParentClass {  
  3. }  

然后我们在脚本中写:

  1. trace(ParentClass.prototype, ChildClass.prototype); 

结果输出:

  1. [object Object] [object Object]   

 从这里的结果[object Object] ,我们可以看出第一个object 代表对象,而第二个Object代表Object类,整个的意思就是说这是一个对象,他是Object类。

我们可以动态地向原型对象中添加属性,并且在父类的prototype中添加的属性是可以被子类所共享的,下面通过一个例子加以说明,我们在父类的prototype中加入了一个sayHello函数。然后就可以在子类中对其进行访问,与之相对的是,若我们在子类的prototype中添加函数,则其他子类是无法访问到的。即用哪个类向原型加的属性,你就只能用这个类调用。

  1. public class ParentClass  
  2. {  
  3.     prototype.sayHello = function():String  
  4.     {  
  5.         return "hello,ptototype";  
  6.     }  
  7. }  
  8. public class ChildOne extends ParentClass  
  9. {  
  10. }  
  11. public class ChildTwo extends ParentClass  
  12. {  
  13. }  
  14.  
  15. public function onCreate():void  
  16. {  
  17.     var strInfo:String = ChildOne.prototype.sayHello();  
  18.     trace(strInfo);  
  19.     var str1:String = ChildTwo.prototype.sayHello();  
  20.     trace(str1);  
  21.     ChildOne.prototype.testFunc = function() : void  
  22.     {  
  23.         trace("just for test.");  
  24.     }  
  25.     ChildOne.prototype.test();  
  26.     //ChildTwo.prototype.test();  

类的实例跟类在原型对象上还有一点区别的,一个类的实例最初的原型对象都是未定义的,既不是O bject类也不是定义这个实例的类。也就是说当我们对一个类进行实例化时,这个实例的原型对象是未定义的。

    我们对上面定义的ChildOne类进行实例化:

  1. var c1:ChildOne = new ChildOne();  
  2. trace(c1.prototype); 

测试输出:

  1. undefined 

但是实例的prototype属性我们可以动态给他赋值,前提是类必须要是动态类。代码如下:

 

  1.  var c1:ChildOne = new ChildOne();  
  2. c1.prototype = ChildTwo;  
  3. trace(c1.prototype); 

测试输出:

  1. [class ChildTwo] 

      这表明是它的原型对象是一个类, 类名为ChildTwo

最后再补充一点关于命名空间的知识, 命名空间中可以放置函数,变量和常量,但不能放置类的定义。下面是一个简单的命名空间的实例:

 public namespace myspace = "http://phinecos.cnblogs.com";

  1.  
  2. myspace function myfunc():void  
  3. {  
  4.     trace("test namespace.");  
  5. }  
  6.  
  7. use namespace myspace;  
  8. myfunc();  
  9. myspace::myfunc();