Sencha Touch 2.0官方指南:如何使用"類"
簡(jiǎn)單來(lái)說(shuō),類是一個(gè)擁有一些屬性和方法的對(duì)象。例如:定義一個(gè)動(dòng)物類,定義其名稱和功能,使得它能說(shuō)話,我們只需這樣做:
- Ext.define('Animal', {
- config: {
- name: null
- },
- speak: function() {
- alert('grunt');
- }
- });
這樣我們就定義了一個(gè)動(dòng)物類,每個(gè)動(dòng)物可以有一個(gè)名稱,并可以說(shuō)話。要?jiǎng)?chuàng)建一個(gè)新的的動(dòng)物,我們只需這樣:
- var bob = Ext.create('Animal', {
- name: 'Bob'
- });
- bob.speak(); //alerts 'grunt'
在這里,我們創(chuàng)建了一個(gè)名為Bob的動(dòng)物,并命令它說(shuō)話?,F(xiàn)在,我們已經(jīng)定義了一個(gè)類和并創(chuàng)建了一個(gè)實(shí)例,但我們不知道鮑勃是什么物種,所以讓我們定義一個(gè)人類的作為動(dòng)物類的子類:
- Ext.define('Human', {
- extend: 'Animal',
- speak: function() {
- alert(this.getName());
- }
- });
現(xiàn)在我們已經(jīng)從動(dòng)物類繼承了一個(gè)新的的人類,因此人類獲得其所有的方法和配置。實(shí)際上,我們重寫了說(shuō)話的方法,因?yàn)榇蠖鄶?shù)人有足夠的智慧,說(shuō)他們的名字,而不是咕嚕咕嚕地叫?,F(xiàn)在,我們創(chuàng)建一個(gè)名為Bob的人,并讓他說(shuō)話:
- var bob = Ext.create('Human', {
- name: 'Bob'
- });
- bob.speak(); //alerts 'Bob'
你應(yīng)該也注意到了上面的代碼中使用了getName方法,然而我們并沒有定義動(dòng)物類的getName方法。那它來(lái)自哪里?答案是:框架自動(dòng)幫每一個(gè)配置項(xiàng)添加了以下方法:
一個(gè)getter方法 - 如getName就是返回name的當(dāng)前值。
一個(gè)setter方法 - 如getName就是為name設(shè)置一個(gè)新值。
an applier function - applyName() in this case - which is called by the setter and lets you run a function when a configuration changes
getter和setter都是自動(dòng)生成的,建議大家使用它們來(lái)存取類里面的數(shù)據(jù)。ST的每一個(gè)組件都使用了getter和setter的模式,這意味著如果我們知道一個(gè)配置項(xiàng),也就知道如何獲取和設(shè)置它的值了。
這也讓你的的代碼更整潔。舉個(gè)例子:如果你想在改變Bob的名字時(shí)詢問(wèn)用戶。就可以定義applyName方法,它會(huì)被自動(dòng)調(diào)用:
- Ext.define('Human', {
- extend: 'Animal',
- applyName: function(newName, oldName) {
- return confirm('Are you sure you want to change name to ' + newName + '?');
- }
- });
我們用瀏覽器內(nèi)建的confirm方法彈出了一個(gè)確認(rèn)操作的對(duì)話框。如果applier方法返回的是false,那name的值將不會(huì)發(fā)生改變。
- var bob = Ext.create('Person', {
- name: 'Bob'
- });
- bob.setName('Fred'); //opens a confirm box, but we click No
- bob.speak(); //still alerts 'Bob'
我們已經(jīng)學(xué)習(xí)了類系統(tǒng)的這些內(nèi)容:
用Ext.define來(lái)定義新的類。
用Ext.create來(lái)創(chuàng)建對(duì)象實(shí)例。例如:Ext.create('SomeClass', {some: 'configuration'})
用"extend"來(lái)繼承擴(kuò)展類。
使用系統(tǒng)自動(dòng)生成的getter和setter方法,這會(huì)讓代碼更整潔。
現(xiàn)在,你已經(jīng)學(xué)會(huì)如何定義和使用一個(gè)類。但類系統(tǒng)的內(nèi)容遠(yuǎn)遠(yuǎn)不只這些。
依賴與動(dòng)態(tài)加載
大多數(shù)時(shí)候,類之間都存在著依賴。我們可以使用"requires"關(guān)鍵字來(lái)引入一個(gè)被依賴的類。人類依賴動(dòng)物類并擴(kuò)展動(dòng)物類,這種情況下并不需要特殊的說(shuō)明,用"extend"就已經(jīng)表明了這種依賴關(guān)系。
- Ext.define('Human', {
- extend: 'Animal',
- requires: 'Ext.MessageBox',
- speak: function() {
- Ext.Msg.alert()
- }
- });
當(dāng)你像這樣定義一個(gè)類的時(shí)候,ST就會(huì)檢查并異步加載Ext.MessageBox。
Ext.MessageBox也可能依賴于其他類,這些類也將在后臺(tái)自動(dòng)加載。Ext.MessageBox和動(dòng)物類都加載完畢后,就會(huì)定義人類。然后就可以使用Ext.create實(shí)例化"人"了。
在開發(fā)過(guò)程中,多文件可以讓我們有效地管理代碼,但應(yīng)用發(fā)布后,應(yīng)該盡量減少文件的數(shù)目以提高網(wǎng)絡(luò)響應(yīng)速度。ST2的JSBuilder工具可以分析你的應(yīng)用程序,并將你所有代碼連同你所用到的ST中的類合并成一個(gè)js文件。關(guān)于JSBuilder使用方法的介紹,請(qǐng)看指南的第二部分。
每種方法都有其自身的利弊,我們是否能夠取其精華,去其糟粕?答案是肯定的,在ST2里,我們已經(jīng)實(shí)現(xiàn)了這一目標(biāo)。
命名約定
使用統(tǒng)一的風(fēng)格來(lái)命名類、名空間和文件名有助于更好地組織代碼,保證代碼的條理性和可讀性。
1) 類
類名只能由字符和數(shù)字組成。不要在類名中出現(xiàn)數(shù)字,除非它屬于一個(gè)技術(shù)術(shù)語(yǔ)。不要使用下劃線,連字符,以及任何字母數(shù)字以外的字符。例如:
MyCompany.useful_util.Debug_Toolbar 不要這樣寫
MyCompany.util.Base64 這個(gè)OK
每個(gè)類都要有命名空間。用"."來(lái)為類分配命名空間,把類分配到不同的包內(nèi)。例如:
MyCompany.data.CoolProxy
MyCompany.Application
***的命名空間和類名使用駱駝拼寫法,其他的都用小寫。例如:
MyCompany.form.action.AutoLoad
非框架本身的類,不要使用Ext作為***命名空間。
首字母縮略詞也應(yīng)該遵循上面列出的駱駝拼寫法約定。例如:
使用 Ext.data.JsonProxy 而不用 Ext.data.JSONProxy
使用 MyCompany.util.HtmlParser 而不用 MyCompary.parser.HTMLParser
使用 MyCompany.server.Http 而不用 MyCompany.server.HTTP
2) 源文件
類名直接映射到類文件的存儲(chǔ)路徑。因此,每個(gè)文件對(duì)應(yīng)一個(gè)類(就像java一樣)例如:
Ext.util.Observable 存儲(chǔ)位置為 path/to/src/Ext/util/Observable.js
Ext.form.action.Submit 存儲(chǔ)位置為 path/to/src/Ext/form/action/Submit.js
MyCompany.chart.axis.Numeric 存儲(chǔ)位置為 path/to/src/MyCompany/chart/axis/Numeric.js
其中 path/to/src 是你存儲(chǔ)腳本的目錄(譯者注:這里不是真的"path/to"而是你的app目錄),所有的類都應(yīng)該保存在這個(gè)目錄下,并被正確地劃分命名空間。這樣Ext .require()方法才能正確地動(dòng)態(tài)載入腳本文件。這樣對(duì)將來(lái)的維護(hù)和部署工作都也很會(huì)有幫助。
3) 變量和方法
跟類名一樣, 變量名和方法名只能由字符和數(shù)字組成。不要在類名中出現(xiàn)數(shù)字,除非它屬于一個(gè)技術(shù)術(shù)語(yǔ)。不要使用下劃線,連字符,以及任何字母數(shù)字以外的字符。
變量名和方法名應(yīng)該使用首字母小寫的駱駝拼寫法。示例:
好的方法名: getHtml() getJsonResponse() parseXmlContent()
不好的方法名:getHTML() getJSONResponse() parseXMLContent()
好的變量名:isGoodName base64Encoder xmlReader httpServer
4) 屬性
除靜態(tài)屬性以外的類的屬性,其命名方式跟方法和變量的一樣。
靜態(tài)屬性全部用大寫命名,例如:
Ext.MessageBox.YES = "Yes"
Ext.MessageBox.NO = "No"
MyCompany.alien.Math.PI = "4.13"