原型继承是早起AS版本所使用的集成方式,在AS3中允许两种方式的集成——类继承和原型继承。
原型继承的基本原理:
每 种类都有一个关联的原型对象,而原型对象的属性由该类的所有实例共享。 在创建一个类实例时,它具有对其类的原型对象的引用,这将作为实例及与其关联的类原型对象间的链接。 运行时,如果在类实例中找不到某属性,则会检查委托(该类的原型对象)中是否有该属性。 如果原型对象中不包含该属性,该过程会继续在层次结构中连续的更高级别上对原型对象进行委托检查,直至 Flash Player 找到该属性为止。
看一段代码:
Sprite.prototype.copyright="www.iflashigame.com";
var sp:Sprite=new Sprite;
trace((sp as Object).copyright); //输出www.iflashigame.com
如果不用类型声明也可以写成这样:
Sprite.prototype.copyright="www.iflashigame.com";
var sp=new Sprite;
trace(sp.copyright);
需要注意的是如果是非动态类那么为类原型添加的属性会成为一个只读属性,例如:
Sprite.prototype.copyright="空";
var sp=new Sprite;
var mc=new MovieClip;
trace(sp.copyright); //输出 "空"
trace(mc.copyright); //输出 “空",由于MovieClip继承自Sprite,所以也能得到属性
sp.copyright="www.iflashigame.com"; //报错了,无法为 flash.display.Sprite 创建属性 copyright。
mc.copyright="www.iflashigame.com"; //新的值将覆盖继承过来的
trace(sp.copyright); //无法赋值,还是输出 "空";
trace(mc.copyright); //输出"www.iflashigame.com";
trace(Sprite.prototype.copyright); //没有改变,还是输出 ”空"
了解了原型继承原理,可以帮助我们在某些特殊场合应付一些特殊的需求。比如最近在一个游戏设计需求中就可以用这种办法解决:今天在做游戏的时候游戏中有一个简单需求:
有一个人物,鼠标移到上面的时候需要显示手型指针。
if(MouseEvent.MOUSE_OVER) Mouse.cursor="button";
但是玩家点击了攻击键之后,需要隐藏鼠标,用一个瞄准镜的MC来替代鼠标。此时当这个瞄准镜移动到人物身上的时候无需显示手型指针了。
Mouse.hide();
myMouse.visible=true;
myMouse.enterframe——》跟随鼠标
现在问题来了,由于Mouse.cursor=“button”封装在了人物类里面,我们需要让他知道鼠标已经被隐藏了,不用再显示手型了。如果通过破坏封装让人物类到外面取鼠标状态肯定不太好。而Mouse这个类又没有一个属性来查看鼠标时隐藏了还是显示着。
怎么办???
这个时候正好可以利用原型继承的特点可以很方便的实现
对于这个问题我们只要能够记录鼠标是否被隐藏就能够解决问题,为了不破坏封装。我们把Mouse类当成一个我们自己的静态类来用。
首先,在Mouse.hide()执行的时候,添加一句 Mouse.prototype.isHide=true;
在Mouse.show()执行的时候,添加一句 Mouse.prototype.isHide=false;
然后在人物的MouseOver侦听事件加一个条件判断
if(!Mouse.prototype.isHide)
Mouse.cursor="button"
问题解决了。
唐山flash原创动画 。本教程由 唐山卡动互动影视动漫 转载 如有版权问题请联系删除。