JS設計模式

一、工廠模式

工廠模式相似於現實生活中的工廠能夠生產大量類似的商品,去作一樣的事情,實現一樣的效果。 用函數來封裝以特定接口建立對象的細節函數

function Person(name,age){
    var obj=new Object();
    obj.name=name;
    obj.age=age;
    obj.sayName=function(){
        return this.name;
    }
    return obj;
}
var p1=Person('cdsvf','33');
console.log(p1.sayName());//cdsvf
console.log(p1.constructor);//Object 不知道是哪一個對象的實例 應該是Person的實例

說明:一、在函數中定義對象,並定義對象的各類屬性,雖然屬性能夠爲方法,但建議將屬性爲方法的屬性定義到函數以外,這樣就能夠避免重複建立該方法。this

   二、在函數的最後返回該對象spa

工廠模式是爲了解決多個相似對象聲明的問題,即解決實例化對象時產生重複的問題。prototype

缺點:不知道是哪一個對象的實例code

二、構造函數

function Person(name,age){
    this.name=name;
    this.age=age;
    this.sayName=function(){
        return this.name;
        }
}
var p1=new Person('cdsvf','33');
var p2=new Person('asw','12');
console.log(p1.sayName());//cdsvf
console.log(p1.constructor);//Person
console.log(p2.constructor);//Person

說明:一、與工廠模式相比,使用構造函數建立對象時無需在函數內部建立對象,而是使用this指代,且函數無需return對象

     二、p1和p2分別保存着Person的一個不一樣實例blog

三、原型模式

var sayName=function(){
    return 'name';
}
function Person(){
    Person.prototype.name='cdsvf';
    Person.prototype.age='33';
    Person.prototype.sayName=sayName;
}
var p1=new Person();
console.log(p1.name);//cdsvf

說明:函數中不對屬性進行定義,利用prototype屬性對屬性進行定義。接口

四、構造函數+原型模式(推薦)

function Person(){
    this.name='cdsvf';
    this.age='33';
}
Person.prototype.sayName=function(){
    return this.name;
}
var p1=new Person();
console.log(p1.name);//cdsvf

五、單例模式

保證一個類僅有一個實例,用一個變量來標誌當前是否已經爲某個類建立過對象,若是是,則在下一次獲取該類的實例時,直接返回以前建立的對象。事件

var Single = (function(){
    var instance;
    function init() {
        //define private methods and properties
        //do something
        return {
            //define public methods and properties
        };
    }

    return {
        // 獲取實例
        getInstance:function(){
            if(!instance){
                instance = init();
            }
            return instance;
        }
    }
})();

var obj1 = Single.getInstance();
var obj2 = Single.getInstance();

console.log(obj1 === obj2);

六、觀察者模式

定義對象之間的一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴它的對象都將獲得通知。由主體和觀察者組成,主體負責發佈事件,觀察者經過訂閱這些事件來觀察主體。內存

例如事件綁定,就是一個標準的觀察者模式

document.body.addEventListener('click',function(){
    console.log('3');
})
document.body.click();

對於發佈者代碼如自定義事件,handlers用於存放訂閱者以及訂閱者訂閱的事件

應用場景:

(1)DOM事件

(2)自定義事件

優勢:時間上解耦,對象之間解耦

缺點:建立訂閱者自己要消耗必定的時間和內存,當訂閱一個消息後,也許該消息永遠也沒有發生,可是這個訂閱者會始終存在於內存中。

   雖然弱化了對象之間的聯繫,可是過分使用的話,對象與對象之間的必要聯繫也被深埋在背後,致使程序難以跟蹤維護和理解。

相關文章
相關標籤/搜索