第十一章:一點面向?qū)ο缶幊讨R
At is heart, OOP simply means that you treat portions of your program as self-contained, but interrelating modules called objects. 這是什么呀?我不翻譯了,概念的我們就先不懂吧,對象主要構(gòu)成包括屬性(properties)和方法(methods)。一個對象通常都以現(xiàn)實世界里的某個東東做藍本。 例如我們可以定義一個對象叫球,那么這個球?qū)羞@樣的屬性:半徑、X坐標(biāo)、Y坐標(biāo)、顏色。同時,也會用屬于球自己的方法例如:移動球、計算球的面積
當(dāng)然,我們還可以定義一些相對抽象的對象,例如我們要做的多選題
所有的對象都屬于某類(class),類的意思其實是用于創(chuàng)建對象的模版
一個實例(instance)就是某一個類的特定某一個case(好復(fù)雜,概念性的東西我翻不過來啦,反正實例就類創(chuàng)建出來的某一個對象)
還是再舉例吧 * 例如我們有個一個叫Chair的類 * 這個類定義了一個東西需要它有四條腿,一個坐墊 * 然后我們就可以用Chair這個類來定義我們的不同對象(可理解為椅子的款式),每個對象就有它特有的高、寬、材料、重量、顏色,正是這些屬性使每個對象互相區(qū)別。
所有的椅子互相區(qū)別,有自己的屬性,但是他們又有同樣的結(jié)構(gòu):四條腿、一個坐墊
OK,那AS里面的類和對象呢? 是的,AS里我們可以自己創(chuàng)建對象,也有可以使用的內(nèi)建對象 內(nèi)建的類(你可以用它來創(chuàng)建對象)包括:Array, Boolean, Color, Date, MovieClip, Number, Object, Sound, String, XML, XMLSocket 內(nèi)建的對象(已經(jīng)可以直接使用的對象)包括:Arguments, Key, Math, Mouse, Selection 內(nèi)建的類、對象當(dāng)然都是在FLASH里面有自己功能的東西。而正是這些功能非常常用,F(xiàn)LASH才內(nèi)建了這些類和對象,例如: Mouse.hide(); // Hide the mouse pointer 將鼠標(biāo)隱藏,你經(jīng)常用吧?現(xiàn)在才知道其實是內(nèi)建的Mouse對象的一個hide()方法吧?
在學(xué)習(xí)如何創(chuàng)建自己的類和對象之前,先來了解一下內(nèi)建類和對象是怎樣工作的吧
與數(shù)組的結(jié)構(gòu)類似,對象是容器們(containers)的容器(container) 一個對象,用各個獨立的屬性來存放數(shù)據(jù),只不過數(shù)組區(qū)分每個容器是用數(shù)字,而對象則是用屬性名,要調(diào)用一個數(shù)組里面某個數(shù)據(jù),我們需要它是索引值,而要調(diào)用對象的屬性,則要知道屬性名 看看以下這個例子,這是個叫BALL的對象:
BALL對象有兩個屬性:radius 和 color 而兩個屬性分別賦值為:50 和 0xFF0000 (這是AS里面表達16進制的方法)
概念清楚了,說一AS里面使用對象要注意的地方
首先,對象的屬性很靈活,它儲存的數(shù)據(jù)可以是strings(字符串), numbers(數(shù)字), booleans(布爾值), null(空), undefined(未定義), functions(函數(shù)), arrays(數(shù)組), movie clips(電影夾子), or even other objects(甚至是其他的對象,包括自定義的).
調(diào)用屬性,可用點語法:objectName.propertyName 例如我們賦值給BALL里面的屬性radius: ball.radius = 100;
我們也可以用符號[]來訪問屬性,但是[]里面的屬性名需用雙引號擴住,同上例: ball["radius"] = 100; (所以說數(shù)組也是對象一種,訪問方法也一樣,并沒有搞特殊化) 與點語法比較,[]更靈活,可以動態(tài)地改變屬性的名字,里面可以是變量或表達式,例如: var propName = "radius"; ball[propName] = 100; 這點是點語法無法辦到的
純粹的OOP中,我們幾乎不會直接訪問對象的屬性 我們一般都使用方法(methods) ,來改變屬性 例如改變mySound這個聲音對象的音量屬性 AS的用法應(yīng)該是mySound.getVolume(100); 而不是mySound.volume=100; 但是為了簡單,多選題這個例子里不一定遵循這個原則,事實上AS里面很多對象都不可以辦到這點,所以有人說AS不是面向?qū)ο笳Z言。
關(guān)于對象的方法
方法method其實是一些附屬于對象的函數(shù),其作用主要是訪問對象中的數(shù)據(jù),或完成某種功能。所以調(diào)用方法和調(diào)用普通函數(shù)類似:objectName.methodName() 只是前面加上了對象的名字。 例如上面的BALL對象,我們需要它的面積,使用 getArea 這個方法: ball.getArea();
預(yù)習(xí)一下,在下一個例子中,雖然MOOCK不打算建立自己的方法,但是將使用內(nèi)建于MovieClip對象的兩個方法: *MovieClip.attachMovie() 此方法是將Library(CTRL+L按出來的那個)里面的symbol復(fù)制一個instance到場景中 (chocobo:給不懂概念的人緊急補習(xí),放在庫(Library)里面的叫符號(symbol),拉到場景中就叫實例(instance),一個符號可創(chuàng)建多個實例,符號改變則實例隨之改變) 與之類似的是MovieClip.duplicateMovieClip(),但是該方法需要事先在場景里已經(jīng)有一個實例
*MovieClip.removeMovieClip() 此方法與上面相反,是刪除場景里面的instance的
大家看到了,在下一例中,我們將使用MovieClip這個內(nèi)建對象,因為它就可以滿足我們的需要,不必新類型的對象了 我們先來熟悉一下MC這種對象
它有很多屬性_height(高度)、 _alpha (透明度),MC的屬性大家可以在AS字典里面查到,在AS面板里這寫屬性也是變色顯示的。同時MC的方法,例如 MC.play(); 等也可以查到。當(dāng)我們在MC里面的時間線使用這些屬性、方法的時候,可以省略不寫前面部分,直接寫play();
MC可以互相嵌套,MC當(dāng)中又有MC,就出現(xiàn)類似: mc1.mc2.play(); 的情況 為了調(diào)用包含自己的上一級MC的方法、屬性,AS里面用_parent,例如: 在mc1包含mc2 ,在mc2中想使mc1播放:_parent.play(); 還有另一個保留字:_root指代該電影的主時間線 例如想在某個mc里面讓整個電影播放:_root.play(); 想在某個MC中讓另一mc1播放:_root.mc1.play();
還有,MC中定義的變量,將作為MC的一個屬性可被訪問 在mc1里面寫了一句 var a=1; 我們將可使用 mc1.var來調(diào)用它
關(guān)于類(class)
這個概念大家還是不大懂吧?類就是定義一個對象將擁有什么的方法跟屬性的東東,類似MC里instance與symbol的關(guān)系,instance的結(jié)構(gòu)就是由symbol決定的,每個instance又可以不一樣 AS里面沒有專門定義類的例如class這樣的關(guān)鍵字,我們使用函數(shù)來定義類,這種函數(shù)稱構(gòu)造函數(shù)constructor function,函數(shù)的作用就是產(chǎn)生我們定義好的類的實例(就是對象) 舉例最實在: // make a Ball constructor 最簡單的構(gòu)造函數(shù) function Ball () { // do nothing 里面是空的 } 現(xiàn)在我們可以定義新類型Ball的對象了 myBall = new Ball(); 語法就是前面是新對象實例名,等號后是new加構(gòu)造函數(shù)名 myBall就擁有了Ball定義的一切結(jié)構(gòu)了(雖然Ball里面是空的,嘻嘻)
不過不是所有對象創(chuàng)建都用new,例如mc創(chuàng)建就用的是attachMovie()或duplicateMovieClip()
好了,我們的構(gòu)造函數(shù)總不能空的,如何定義類,讓新對象有自己的屬性呢? 使用this這個關(guān)鍵字,看例子,新的構(gòu)造函數(shù): function Ball () { this.radius = 10; this.color = 0xFF0000; this.xPosition = 35; this.yPosition = -4; } 以后我們定義出來的新對象,都擁有半徑,顏色、XY坐標(biāo)屬性啦 慢著,怎么每個新對象都一模一樣? 再改,用函數(shù)的參數(shù)來定義動態(tài)的屬性: // Make the Ball constructor accept // property values as arguments. function Ball (radius, color, xPosition, yPosition) { this.radius = radius; this.color = color; this.xPosition = xPosition; this.yPosition = yPosition; } 我們可以定義不同屬性的對象了 myBall = new Ball(6, 0x00FF00, 145, 200);
本教程關(guān)于還有創(chuàng)建方法以及如何在類之間繼承方法和屬性沒講, 無論如何,OOP都不可能在這么短時間之內(nèi)說清楚, 但這不妨礙我們做下一個例子了。
出處:藍色理想
責(zé)任編輯:qhwa
上一頁 第三個版本的選擇題 下一頁 第四個版本的選擇題
◎進入論壇Flash專欄版塊參加討論
|