AS2实现空MC绑定自定义类

By:无上魔法 Date:2009-06-05

以前读书的时候学习的Flash,多是直接设计比较少接触到使用AS的;写程序久了,就变得不喜欢用设计了,确实有些应用也没办法离开AS。
  最近制作一个SNS浏览器,我就全部用了AS来写,包括界面、数据操作等等都是;越是深入写就越觉得AS2.o如果作为一种OO的语言来设计应用还是有些不足之处,至少有些方面例如直接使用MC子类来创建并连接空MC是不可能的事,一定要出现在库中的元件才可以连接到自定义类;这就限制了其完全代替设计工具的能力;百般无奈下,我只好使用了另一种方法来实现实例化自定义类的同时,创建连接该类的空MC以供绘画等AS操作的功能;该方法将自定义类的所有方法作为MovieClip超类的方法附加到MovieClip类,之后这些方法就可以操纵MC了:

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number)
    {
        if(arguments.length<3)
        {
            trace("MovieClip.createClassMovieClip arguments miss!");
            return;
        }
        var tOld=MovieClip.prototype;
        MovieClip.prototype=new aClass();
        var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
        MovieClip.prototype=tOld;
        return tRefer;
    }

上面的方法有个缺点就是不能调用构造函数,而且照我的想法这个方法其实是重新构造MC的超类,因此假如自定义类中要是有个与MC同名的成员,则应该被MC本身成员覆盖;所以google了一下,找到个老外写的:
http://www.helpqlodhelp.com/blog/archives/000087.html
按照老外所说的应该是修改MC的原型链,但是如果prototype指向MC的超类那么继承自MC的自定义类的超类也是MC,则MovieClip.prototype=myClass.prototype;语句应该是把MC的超类指向MC本身?郁闷~附加到原型链就是这样吗?我结合老外的做法,写出下面的方法:

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number,aArg:Array)
    {
        if(arguments.length<3)
        {
            trace("MovieClip.createClassMovieClip arguments miss!");
            return;
        }
        var tOld=MovieClip.prototype;
        MovieClip.prototype=aClass.prototype;
        var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
        MovieClip.prototype=tOld;
        aClass.apply(tRefer,aArg);
        return tRefer;
    }

 

结果发现该方法完全可行,并且能够重写MC的方法,也可以调用构造函数~  ;
然后我又改了一下;
 

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number,aArg:Array)
    {
        if(arguments.length<3)
        {
            trace("MovieClip.createClassMovieClip arguments miss!");
            return;
        }
        var tOld=MovieClip.prototype;
        MovieClip.prototype=new aClass();//here
        var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
        MovieClip.prototype=tOld;
        aClass.apply(tRefer,aArg);
        return tRefer;
    }

注意看注释的不同处,使用结果发现居然和前面的一模一样,可以重写方法……郁闷了,有没有人知道怎么会事?
以上两个方法都是可以正常使用的。下面给出例子。

main.as:-------------------------------------------

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number,aArg:Array)
    {
        if(arguments.length<3)
        {
            trace("MovieClip.createClassMovieClip arguments miss!");
            return;
        }
        var tOld=MovieClip.prototype;
        MovieClip.prototype=aClass.prototype;
        var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
        MovieClip.prototype=tOld;
        aClass.apply(tRefer,aArg);
        return tRefer;
    }
   
    import Container;
   
    var t=_root.createClassMovieClip(Container,"dd",10);
   
    t.addElemt();
   
    t.hi();
   
    t.getURL(http://www.yaszone.com/wp);

 

Container.as :----------------------------------------

import Element;
 
    class Container extends MovieClip
    {
        public function Container()
        {
            this._x=0;
            this._y=0;
            this.lineStyle(1,0x000000);
            this.beginFill(0x666666,50);
            this.moveTo(0,0);
            this.lineTo(200,0);
            this.lineTo(200,200);
            this.lineTo(0,200);
            this.lineTo(0,0);
            this.endFill();
            trace("Constructor: Container()"+this);
        }
       
        public function hi()
        {
            trace("Container::hi()");
        }
 
        public function addElemt()
        {
            var t=super.createClassMovieClip(Element,"e1",10);
            trace("Container::"+t);
            return t;
        }
       
        public function getURL(aUrl:String)
        {
            super.getURL(aUrl,"_blank");
            trace(aUrl);
        }
       
    }

 

Element.as:-----------------------------------------------

class Element extends MovieClip
    {
        public function Element()
        {
            this._x=50; 
            this._y=50;
            this.lineStyle(1,0x000000);
            this.beginFill(0xFF0000,50);
            this.moveTo(0,0);
            this.lineTo(100,0);
            this.lineTo(100,100);
            this.lineTo(0,100);
            this.lineTo(0,0);
            this.endFill();
            trace("Constructor: Element()"+this);
        }
       
        public function hi()
        {
            trace("Element::hi()");
        }
       
        public function onRelease()
        {
            trace("Element::onPresss()");
        }
       
       
    }

参与讨论去: 艾睿(Airia) 交朋友去:友吧推荐文章去:网站贴吧
企业招聘

北京中视力天文化传媒有限公司

公司简介:北京中视力天文化传媒有限公司,是CCTV.com央视国际网络有限公司投资的互联网研发团队。我们是天使的使者。。。

招聘FlashAS程序员详情点击

Copyright 2007-2008 51AS.com Extended in kingcms 鲁ICP备06001158号