來源:網易郵箱
上一篇文章介紹了網易郵箱前端Javascript編碼規範的第一部分,關於變數和函式的編碼規範,本篇文章將繼續介紹網易郵箱制定的javascript類編碼規範。
網易郵箱頁面在window只允許定義三種變數——1:全域性變數;2:常量;3:類。任何業務邏輯都需要通過類方法或者示例方法實現。前兩種變數在之前文章中已經介紹,在此不再累述,接下來詳細介紹類定義和使用的規範。
定義類是通過一個閉包完成的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
(function(){ //第一步:引入存在的類。引入support類 var Support = window.Support; //$是網易郵箱基礎庫“base”的引用稍後會介紹 //第二步:定義類。可以認為返回了一個類定義 function(){},並在window下定義一個Image類 var Image = $.createClass("Image"); //可以認為是jQuery的extend方法 //第三步:定義類屬性/方法定義 $.Object.extend(Image,{ _language : null, //內部屬性 getSize : fImageGetSize }); //第四步:定義例項屬性/方法定義 $.Object.extend(Image.prototype,{ name : null, url : null, ext : null, width : 0, height : 0, setName : fImageSetName, getName : fImageGetName, init : fImageInit }); //第五步:方法實現 function fImageGetSize(nWidth,nHeight){ return nWidth*nHeight; } function fImageSetName(sName){ var oImage = this; oImage.name = sName; } function fImageGetName(){ var oImage = this; return oImage.name; } function fImageInit(sUrl){ var oImage = this; oImage.url = sUrl; oImage.ext = Support.getExt(sUrl); oImage.width = Support.getWidth(sUrl); oImage.height = Support.getHeight(sUrl); } })(); |
我們可以看到,這個閉包完成了以下幾件事情:
1.引入這個類需要用到的其他類。
2.定義這個類。
3.定義類的屬性和方法。
4.定義類的例項屬性和方法。
5.類和例項方法的實現。
在命名上,我們遵循了一下規則:
1.類名首個字母必需大寫,例如Image,Support等。
2.屬性名需要是有意義的名詞,首字母小寫,例如oImage.width。
3.方法名需要是有意義的動詞[+名詞],首字母小寫,例如Support.getWidth
4.如果不希望被其他方法呼叫,需要在屬性或者方法名前面加“_”,例如oImage._language
5.如果不希望被子類呼叫,需要在屬性或者方法名前加“_”,例如oImage.__fire()
這裡需要特別說明以下幾點:
1.方法的定義不是通過匿名函式來定義,而是集中在類定義的下面來實現。這樣的好處是能在最開始將類的屬性方法定義都羅列出來,便於通過原始碼檢視到對應屬性和方法。
2.在類/例項方法中,使用區域性變數代替this。this不是一個好的玩意兒,一不小心就會被this搞暈。使用區域性變數能夠儘量避免這樣的問題,也能夠在壓縮混淆的時候效果更好。
3.在實際開發過程中,每個類定義都單獨一個js實現。
除了類的定義,閉包不實現 任何其他邏輯。使用閉包能夠將很多變數約束在閉包作用域中,並且能夠在壓縮混淆中效果更好,除此之外,使用閉包定義類,在之後將介紹到的動態載入成為了一件十分容易的事情,稍後會和大家一起分享。