靈活的語言-JavaScript

剛開始去公司實習的時候白群,接到了一個驗證表單的任務尚胞,內(nèi)容不多,需要驗證用戶名帜慢,郵箱 辐真,密碼~接到需求手,立刻寫下了以下幾個函數(shù)

function checkName(){
    // 驗證姓名
}
function checkEmail(){
    // 驗證郵箱
}
function checkPasswork(){
    // 驗證密碼
}

我相信作為剛入職的新人崖堤,大家都很可能會這樣寫侍咱,但是這樣寫會寫出現(xiàn)很多問題,那就是創(chuàng)建了太多的全局變量


大家再來看看以下幾個代碼

var checkName = function(){
    // 驗證姓名
}
var checkEmail = function(){
    // 驗證郵箱 
}
var checkPassword = function(){
    // 驗證密碼
}

也許有人會說這兩個是不一樣的,確實不一樣密幔,因為這個在用的時候要提前聲明楔脯,但這么看你就會發(fā)現(xiàn)創(chuàng)建了三個函數(shù)保存在變量里來實現(xiàn)你的功能,而你寫的是將你的變量名放在function后面而已胯甩,它也代表了你的變量昧廷,所以說在這里我們也聲明的3個全局變量。

但在團隊協(xié)作中偎箫,我們不能只考慮自己木柬,如果別人也我了同樣的方法就會覆蓋掉原有的功能,特別是你定義了很多方法淹办,這種相互覆蓋的問題是不很不容易察覺到的眉枕。

所以我們應該把它們 放在一個對象里

var CheckObject = {
    checkName: function () {
        // 驗證姓名
    },
    checkEmail: function () {
        // 驗證郵箱
    },
    checkPassword: function () {
        // 驗證密碼
    }
}

當然了,我們也可以通過我們熟悉的點(obj.xxx)方法來創(chuàng)建

var CheckObject = function() {}
CheckObject.checkName: function () {
        // 驗證姓名
    },
CheckObject.checkEmail: function () {
        // 驗證郵箱
    },
CheckObject.checkPassword: function () {
        // 驗證密碼
    }

但這里又會有一個問題出現(xiàn)怜森,我們自己使用這個方法的時候確實非常方便速挑,便如果別用想使用就會有些麻煩了,因為這個對象不能復制一份副硅,或者說這個對你在用new關鍵字創(chuàng)建新的對象的時候姥宝,新的對象是不能繼承這些方法的。

這里舉個例子恐疲,如果我喜歡某本書腊满,買回去后套么,我的小伙伴看見了,感覺很有用碳蛋,可書就一本要怎么辦,如果再買一本就太浪費了胚泌。所以如果你有一臺復制機,那么你小伙伴再多疮蹦,你也有能力給他們每人復印一本

如果想簡單地復制一下诸迟,你可以將這些方法放在一個函數(shù)對象中

var CheckObject = function() {
    return {
        checkName: function () {
        // 驗證姓名
        },
        checkEmail: function () {
        // 驗證郵箱
        },
        checkPassword: function () {
        // 驗證密碼
        }
    }
}

// 所以以后我們想再次使用的時候就可以這樣

var a = CheckObject
a.checkEmail

雖然創(chuàng)建了新對象完成了我們的需求,但是按面向對象的編程思想愕乎,這不是一個正直意義上類的創(chuàng)建方法阵苇,而且創(chuàng)建的的對象a和CheckObject沒有任何關系(返回出來的對象本身就與CheckObject對象無關),所以我們要稍加改造一下

var CheckObject = function() {
    this.checkName: function () {
        // 驗證姓名
    },
    this.checkEmail: function () {
        // 驗證郵箱
    },
    this.checkPassword: function () {
        // 驗證密碼
    }
}

像上面這樣寫就可以看成是一個類了,既然是一個類了感论,我我們就應該用new來創(chuàng)建

var a = new CheckObject()
a.checkEmail

但是绅项,我們把所有的方法放在函數(shù)內(nèi)部,并通過this來定義比肄,第一次通過new關鍵字創(chuàng)建新對象里快耿,新創(chuàng)建的對象都會對類的this上的屬性進行復制 ,而這些新創(chuàng)建的對象都會有自己的一套方法芳绩,然而有時候這么做千萬的消耗是非常奢侈的掀亥,我們再處理一下

var CheckObject = function(){}
CheckObject.prototype.checkName = function(){
    // 驗證姓名
}
CheckObject.prototype.checkEmail = function(){
    // 驗證郵箱
}
CheckObject.prototype.checkPassword = function(){
    // 驗證密碼
}

這樣創(chuàng)建對你的時候,創(chuàng)建出來的對象所擁有的方法就都是一個了妥色,因為它們都要依賴prototype原型依次尋找搪花,這樣做的問題在于我們要寫很多次prototype,所以我們可以這樣做

var CheckObject = function(){}
    CheckObject.prototype = {
        checkName : function(){
            // 驗證姓名
        }
        checkEmail : function(){
            // 驗證郵箱 
        }
        checkPassword : function(){
         // 驗證密碼
        }
    }
}

但有一點要特別提醒一下嘹害,這兩種方式不能混著用撮竿,這樣做后面的對象的原型對象賦值新對象時,就會覆蓋掉前對prototpye對象賦值的方法

繼續(xù) 笔呀,在這里我們又發(fā)現(xiàn)這么做又會有一個新的問題幢踏,就是如果我想一次過驗證賬號,郵箱和密碼就必需要單獨調(diào)用许师,這是可以避免的房蝉。知道this吧,在JavaScript中枯跑,this指向的是當前對象惨驶,所以你可以將它返回

var CheckObject = function(){}
    CheckObject.prototype = {
        checkName : function(){
            // 驗證姓名
            return this;
        }
        checkEmail : function(){
            // 驗證郵箱 
            return this;
        }
        checkPassword : function(){
            // 驗證密碼
            return this;
        }
    }
    
// 使用的時候先創(chuàng)建一個
// 鏈式調(diào)用
var a = new CheckObject();
a.checkName().checkEmail().checkPassword()

后記,JavaScript是一門靈活的語言敛助,函數(shù)在其中扮演著一等公民。所以使用JavaScript你可以編寫出很多優(yōu)雅的藝術代碼

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屋确,一起剝皮案震驚了整個濱河市纳击,隨后出現(xiàn)的幾起案子续扔,更是在濱河造成了極大的恐慌,老刑警劉巖焕数,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纱昧,死亡現(xiàn)場離奇詭異,居然都是意外死亡堡赔,警方通過查閱死者的電腦和手機识脆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來善已,“玉大人灼捂,你說我怎么就攤上這事』煌牛” “怎么了悉稠?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艘包。 經(jīng)常有香客問我的猛,道長,這世上最難降的妖魔是什么想虎? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任卦尊,我火速辦了婚禮,結果婚禮上舌厨,老公的妹妹穿的比我還像新娘岂却。我一直安慰自己,他們只是感情好邓线,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布淌友。 她就那樣靜靜地躺著,像睡著了一般骇陈。 火紅的嫁衣襯著肌膚如雪震庭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天你雌,我揣著相機與錄音器联,去河邊找鬼。 笑死婿崭,一個胖子當著我的面吹牛拨拓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氓栈,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼渣磷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了授瘦?” 一聲冷哼從身側響起醋界,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤竟宋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后形纺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丘侠,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年逐样,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜗字。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡脂新,死狀恐怖挪捕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戏羽,我是刑警寧澤担神,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站始花,受9級特大地震影響妄讯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜酷宵,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一亥贸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浇垦,春花似錦炕置、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至此虑,卻和暖如春甚纲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朦前。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工介杆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韭寸。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓春哨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恩伺。 傳聞我的和親對象是個殘疾皇子赴背,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容