as笔记。oop与算法。---2

      闪了一下 2004-7-13 18:30
第二章。面向对象编程技术。(oop)(三)

3。为类添加方法。
楼上刚才给类增加的属性。
我们在增加一个方法。例如让一个mc能够水平翻转的。方法。
MovieClip.prototype.flipX=function(){
this._xscale=-this._xscale;
};
MovieClip.prototype.flipY=function(){
this._yscale=-this._yscale;
};
放在第一桢。拖出某mc命名为“a”;


在某按钮上加入按钮
on(press){
a.flipX();//就像startdrag()一样方便!
}
flipY() 的调用。一样简单。

可以用类似方法向类和自定义类添加方法。。(我可以做游戏的时候给人物添加很多属性了。娃哈哈哈!!)
一个简单例子
第二章。面向对象编程技术。(oop)(四)

4。重写内置的方法。(晕死。这么说我们几乎可以改写flash的内置类。构造自己的有自己个性的flash?)

不仅可以给类添加。还可以改写!(重写!)著名的例子是。Branden Hall 收集的string方法。比flash5的默认方法还要快!。(不知道2004需要不?有兴趣的大家来做测试。)只要重写方法。不需要修改代码。string.split()就会快许多!split--(装载)
例。
Array.prototype.push = function(data){
this[this.length]=data;
};
arr=new Array();
arr.push("23");
trace(arr); //得到 23。

5。扩展静态对象。
对于不能创建实例的内置类。(静态类,内置对象,就是math,selection,key)扩展不同。
例如:求三次方。
Math.cube=function(x){
return x*x*x;
};
trace(Math.cube(20));//应该8000。但是2004报错!

**错误** 场景=场景 1, 图层=图层 1, 帧=1:第 36 行: 没有名为'cube'的属性。
Math.cube=function(x){

**错误** 场景=场景 1, 图层=图层 1, 帧=1:第 39 行: 没有名为'cube'的方法。
trace(Math.cube(20));

动作脚本错误总数:2 报错:2


是不是2004不允许扩展math???


静态对象的扩展
staticObject.method=function(){
//代码
};

注意不要这样静态扩展
staticObject.__proto__.method=function(){
//代码
};
这样实际把方法加到Object.prototype中。而所有对象都是Object.prototype继承来。最好不要随便加入东西。除非你真的要这么做!


如果你要加。一定要在for in循环中用未公开的函数ASSetpropFlags()隐藏他们。
ASSetpropFlags(Object.prototype,null,1);
否则会出现在所有对象中!尤其XML节点会麻烦!
第二章。面向对象编程技术。(oop)(五)

----最有价值的部分。什么样的程序是好程序。简洁。美观。这里给出答案。

6。经典oop概念。
1)抽象。把具体的事物抽象为关键的。本质的自定义类。类之间有独立性。
2)封装。相当于黑盒子。我们不需要知道内部构造。只需要入口。出口。就像一个函数。像自动售货机。
好的售货机只关心内部事务。只操作自己的东西。对外部事物不作修改。

好的封装会使你的函数或者类具有独立性。!!

看看一个违反封装原则的函数。
例:
function spin(){
_level5.box._rotation +=10;//第五层的。box的角度加5。
_root.result=_level5._rotation;//把角度赋值给一个全局变量。
}
这个函数明显违反了封装原则。他访问一个用层表示的变量。他改变不属于自己范围的函数。
这个函数你离开他所在的源程序。哪里都不能用!
改版一:
function spin(mc){
mc._rotation+=10;
_root. result=mc._rotation;
}
然后调用spin(_level5.box);
改版二:
function spin(mc){
mc._rotation+=10;
return mc._rotation;
}
这样。result=spin(_level5.box);就更加美丽

改版三:使spin()成为mc类的方法:
Moveiclip.prototype.spin=function() {
this._rotation+=10;
return this._rotation;
}
这样。result=_level5.box.spin();
我们函数已经成为对象的方法。并且完全自包含。

改版四:使动态参数代替常数10;
Moveiclip.prototype.spin=function(angle) {
this._rotation+=angle;
return this._rotation;
}
这样。result=_level5.box.spin(10);

用参数代替10。。好!这样用起来更方便。

再进一步!
改版五:
Moveiclip.prototype.spin=function(angle) {
return ( this._rotation+=angle;)
}

简化!


原则!
1。使用相对引用。不要绝对引用!
2。不要访问_root.改为参数传进来!
3。尽量用this..关注自身!改变自身!
4。将变量限制在函数内部!。
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}
}