浅谈ActionScript3中的原型对象

本文介绍了AS3中prototype属性的概念及其使用方式。通过实例演示了如何利用prototype实现类之间的属性共享,以及类实例与类在原型对象上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicdynamicclassParentClass{}
publicdynamicclassChildClassextendsParentClass{
}

然后我们在脚本中写:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->trace(ParentClass.prototype,ChildClass.prototype);

结果输出:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->[objectObject][objectObject]

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

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

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicclassParentClass
{
prototype.sayHello
=function():String
{
return"hello,ptototype";
}
}
publicclassChildOneextendsParentClass
{
}
publicclassChildTwoextendsParentClass
{
}

public
functiononCreate():void
{
varstrInfo:String=ChildOne.prototype.sayHello();
trace(strInfo);
varstr1:String=ChildTwo.prototype.sayHello();
trace(str1);
ChildOne.prototype.testFunc
=function():void
{
trace(
"justfortest.");
}
ChildOne.prototype.test();
//ChildTwo.prototype.test();
}

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

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

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> varc1:ChildOne=newChildOne();
trace(c1.prototype);

测试输出:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->undefined

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

varc1:ChildOne=newChildOne();

c1.prototype=ChildTwo;
trace(c1.prototype);

测试输出:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->[classChildTwo]

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

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

publicnamespacemyspace="http://phinecos.cnblogs.com";


myspace
functionmyfunc():void
{
trace(
"testnamespace.");
}

usenamespacemyspace;
myfunc();
myspace::myfunc();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值