開發中比較容易理解的代碼套路

前言

今天給你們純手工整理一下本人在開發中認爲比較有用的代碼思想套路,歡迎你們能夠與我一同討論編程

鏈式編程

所謂鏈式編程便是函數調用後返回對象自己數組

var calculator = {
    total:0,
    add (n) {
        // 模擬執行功能
        this.total += n;
        // 爲了能在調用完add()後繼續.substruct() 所以咱們返回對象自己
        return this;
    },
    subtract(n) {
        this.total -= n;
        return this;
    }
}
// 調用
calculator.add(5).add(5).subtract(2).total; // 8複製代碼

高階函數應用-(添加數據並提供刪除方法)

舉個栗子:咱們有一些業務須要添加元素到數組中,但同時也可能過會又要將其移除。更好的方式是咱們把他們封裝成函數,並利用高階函數閉包的特性來標記刪除,這樣就減小了去查找這個元素的問題了promise

var students = [];
function addStudent (stu) {
    // 加入  經過形參標記該學員
    students.push(stu);
    return function () { 
        // 利用閉包獲取stu
        var index = students.indexOf(stu);
        // 刪除該學生
        students.splice(index);
    }
}
var stu = { name:'小明' };
// 試用一下
var stu1 = addStudent(stu);
var stu2 = addStudent({name:'小紅'});
// 一年想到須要刪除了,咱們不須要查找他們了
stu1(); // 刪除小明
stu2(); // 刪除小紅
複製代碼

利用Promise鏈切入(延遲執行)

Promise不只能夠幫助作異步流程控制,同時啥步流程控制也能作,固然更重要是延遲執行和異步中保證順序,好比步驟A到步驟B,中間咱們要等等,也步肯定啥時候完成,所以能夠先定義好兩個步驟,把A步驟的resolve保存起來等待須要調用的時候調用便可(不要試圖和回調函數去比較,由於Promise自己就是爲了解決回調函數不優雅的問題)閉包

// 任務A
function task1() {
    setTimeout(function(){
        // 第一件事
    },2000);
}
function task2() {
    setTimeout(function(){
        // 第二件事
    },1000);
}
// 我先讓第一件事執行,並保存其實例和resolve
var token = (function(){
    var next;
    var p = new Promise(function(resolve){
        // 獲取放行的鑰匙
        next = resolve;
        task1();
    });
    return {
        promise:p,
        next:next
    }
})();
// 定義第二件事
token.promise.then(task2);
// 想讓第二件事執行的話,看我心情咯,來個定時器吧
setTimeout(function () {
    // 就如今吧,作第二件事吧(延遲執行)
    token.next();
},Math.random() * 1000 );


複製代碼

經過中間層來解決問題(裝飾者模式)

不是有句話是JS中任何問題均可以經過中間層來解決,好比咱們寫了一個吃飯的功能,忽然想起來飯前要洗手,那麼怎麼作呢?用你想一想的中間層來對比我寫的中間層,想一想看有什麼不一樣?!dom

var obj = {
    eat:function () {
        console.log('我愉快的吃飯..');
    }
}
obj.wash = function () {
    console.log('洗手');
}
// 裝飾者模式
obj.plus = function (fn1,fn2) {
    fn1();
    return fn2(); 
}
// 忽然學習到《《《飯前要洗手》》》,怎麼辦?
obj.plus(obj.wash,obj.eat);複製代碼

單例模式

有時咱們須要全局中有一個惟一的實例,而不是new一次就一個的時候,就用下面代碼吧,不過細節要注意如下異步

var Leader = (function() {
    var instance; // 閉包不讓外部訪問
    return function (name) {// 構造函數
         if (instance) return instance;
         instance = this;
         this.name = name;
    }
})();

new Leader('凃老師'); // { name:'凃老師'}
new Leader('啓道學院'); // { name:'凃老師'}複製代碼

圖片

相關文章
相關標籤/搜索