Flash5 ActionScript高级编程指南(9)
发布时间:2008-08-14 阅读数: 次 来源:网乐原科技
三、自定义函数的运用
第四点认识:谁雇用我,我就叫谁老板。当然这是一种比喻的说法,但却很形象的指出了函数体中this的真正含义。与一般的面向对象语言不同,FAS中的this只指代调用该函数时的实体。这么说可能比较难懂,那就来看一下下面这个例子:
a = 1;
function myMethod() {
trace(this.a);
}
function myObject(){
this.a = 0;
this.method = myMethod;
}
myobj = new myObject;
myobj.method(); // 3.4式 输出 0
myFunc = myobj.method;
myFunc(); // 3.5式 输出 1
这里,3.4式将如一般情况一样输出myobj对象的成员变量a的值0,而3.5式中的myFunc虽然等价于myobj的方法method(即myMethod),但由于这时的调用实体已变成更外层的对象或影片片段,this.a所指的变量也应为此对象或影片片段的成员(即首句中定义的a),因而输出为1。在C++中,this只能指代本对象的实例,也只能在成员函数中使用,而且要把一个成员函数赋值给某个函数指针也是不被允许的。这也充分体现了FAS中其实根本没有成员函数这一概念,所谓“方法”只不过是结构体中函数指针的伪装罢了。再补充一下,this在没有函数调用时永远只指代外层对象或影片片段,所以别指望下面那段程序能为对象myobj添加成员或为成员赋值:
with (myobj) {
this.a = 0; // a为要添加的成员
this.b = 1; // b为myobj的成员
}
第五点认识:关于new一个对象的实际流程。大家都清楚,创建一个对象的格式是(没有参数时括号可省):
myobj = new myObject(...);
可你有没有想过它的实际操作过程呢?别看它长的那么象Java或者C++里的创建对象实例,它可没那么高级,记住了,FAS里的对象实质可是结构体呀!或许你还不知道,在你定义了一个函数的时候,系统就已经为你自动创建了一个同名对象。而它可没有你函数中用this添加的成员,它的唯一成员只有object类型的prototype。现在你有点明白了为什么要有如3.1式那样:
anyFunction.prototype.anyMember = ...
的写法了吧。以3.2式为例,实际执行创建对象的过程是这样的:
(1)定义myobj为对象(只是一般的对象,无任何成员)
(2)执行new后指定的函数(管它是不是构造函数,但若有this则指该对象)
(3)拷贝myObject.prototype的所有成员到myobj门下
现在你知道FAS中的new与标准面向对象语言中的new的区别了吧,是不是也不用再对prototype产生困惑了呢。
3、函数使用的技巧