js常見設計模式

1.寫出 構(gòu)造函數(shù)模式、混合模式、模塊模式、工廠模式、單例模式、發(fā)布訂閱模式的范例。

JS設計模式大全

  • 構(gòu)造函數(shù)模式
function Person(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function(){
    console.log(this.name)
}
let person = new Person('hh',28)
console.log(person)
  • 工廠模式:創(chuàng)建新的引用,返回一個對象
function createPerson(name,age){
    
    return {
        name: name,
        age: age,
        sayName: function(){
            return name
        }
    }
}
console.log(createPerson('hh',28))
  • 單例模式:只有唯一的實例
let Person2 = (function singleton(){
    var instance
    function init(name,age){
        return {
            name: name,
            age: age
        }
    }
    return {
        createPerson: function(name,age){
            if(!instance){
                instance = init(name,age)
            }
            return instance
        }
       
    }

})()

console.log(Person2.createPerson('hh',28))
console.log(Person2.createPerson('ll',28))
  • 模塊模式:閉包
var Person3 = (function(){
    var name = 'hh'
    var age = 28
    return {
        name: name,
        age: age,
        sayName: function(){
            return name
        }
    }
})()

console.log(Person3)
  • 混合模式:構(gòu)造函數(shù)繼承
function Person4(name,age){
    this.name = name 
    this.age = age
}

Person4.prototype =  {
    sayName: function(){
        return this.name
    }
}

function Student(name,age,score){
    Person.call(this,name,age)
    this.score = score
}

Student.prototype = Object.create(Person4.prototype)
Student.prototype.constructor = Student
Student.prototype.study = function(){
    console.log('I am studying')

}


console.log(new Student('hh',28,100))
  • 發(fā)布訂閱模式 : key/value
var EventCenter = (function(){
    var events = {}
    function on(eve,handler) {
        events[eve] = events[eve] || []
        events[eve].push(handler)
    }
    function trigger(eve,args){
        if(!events[eve]) {return}
        for (let i = 0;i < events[eve].length;i++){
            events[eve][i](args)
        }
    }
    function off(eve){
       delete events[eve]
    }
    return {
        on: on,
        trigger: trigger,
        off: off
    }
})()
EventCenter.on('my_event', function(data){
  console.log('my_event received...');
});
EventCenter.on('my_event', function(data){
  console.log('my_event2 received...');
});
EventCenter.trigger('my_event');

2.使用發(fā)布訂閱模式寫一個事件管理器,可以實現(xiàn)如下方式調(diào)用

var Event = (function(){
    var events = {}
    function on(eve,handler) {
        events[eve] = events[eve] || []
        events[eve].push(handler)        
    }
    function trigger(eve,args){
        if(!events[eve]) {return}
        for (let i = 0;i < events[eve].length;i++){
            events[eve][i](args)
        }
    }
    function off(eve){
       delete events[eve]
    }
    return {
        on: on,
        trigger: trigger,
        off: off
    }
})()


Event.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
Event.fire('change', '饑人谷');
Event.off('change');
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容