前端设计模式

作者: 虚玩玩TT | 来源:发表于2017-09-02 17:02 被阅读0次
    构造函数模式

    constructor ,prototype ,new

    function People(name,age){
      this.name = name
      this.age = age
      this.sayHello()
    }
    People.prototype.sayHello = function(){
      console.log(this.name + ': "Hello"')
    }
    
    new People('xww',12)
    
    工厂模式

    factory ,创建一个对象,return 出来

    function createPeople(name){
      var people = {
        name: name
      }
      people.sayHello = function(){
        console.log(this.name + ': "Hello"')
      }
      return people
    }
    
    createPeople('xww')
    
    单例模式

    singleton ,创建不同新对象的时候都指向同一个对象,使用一个立刻执行函数,形成闭包,里面的变量不会受外部影响,而创建新对象的时候是访问的闭包里面 return 出来的一个接口,再加上判断语句就可以实现创建不同对象后都指向同一个对象

    var People = (function(){
      var instence
      function init(name){
        return {
          name: name
        }
      }
      return {
        createPeople: function(name){
          if(!instence){
            instence = init(name)
          }
          return instence
        }
      }
    }())  
    
    People.createPeople('xww')  //{name: 'xww'}
    People.createPeople('xwwxww')  //{name: 'xww'}
    
    混合模式

    mixin ,处理继承,一般通过构造函数

    function People(name){
      this.name = name
    }
    People.prototype.sayHello = function(){
      console.log(this.name + ': "Hello"')
    }
    
    function Person(name,age){
    
    //call 方法让当前的 this 传递给 People 中的 this ,实现属性的继承 
      People.call(this,name)  
    
      this.age = age
      this.sayHello()
      this.sayYes()
    }
    
    //给 Person 的 prototype 赋值,指向 People.prototype,实现方法继承
    Person.prototype = create(People.prototype)
    
    function create(obj){
      function f(){}
      f.prototype = obj
      return new f()
    } 
    
    //然后才可以给自己写方法
    Person.prototype.sayYes = function(){
      console.log(this.name + ': "yes"')
    }
    
    new Person('xww',20)
    
    模块模式

    module,通过闭包来实现一个模块

    var People = (function(){
      var name = 'xww'
      function sayHello(){
        console.log(this.name + ': "Hello"')
      }
      return {
        name: name,
        sayHello: sayHello
      }
    })()
    
    Person.name  // 'xww' ,在模块中写好的方法属性,直接使用
    
    订阅发布模式

    publish / subscibe
    subscibe :订阅,通过调用这个方法,传入事件名和需要执行的函数,但是不执行
    publish :发布,通过调用这个方法,传入事件名,执行函数

    var EventCenter = (function(){
      var events = {}
      function on(evt,handler){
        events[evt] = events[evt] || []
        events[evt].push({
          handler: handler  //需要执行的函数
        })
      }
    
      function fire(evt,args){
        if(!events[evt]){return}
        for(var i = 0; i < events[evt].length; i++){
          events[evt][i].handler(args)  //args表示函数需要传递的所有参数
        }
      }
    
      function off(evt){
        delete events[evt]  //直接从event对象中将订阅的键值对删除即可
      }
    
      return {
        on: on,
        fire: fire,
        off: off
      }
    })()
    

    订阅发布模式使用

    var Event = (function(){
      var events = {}
      function on(evt,handler){
        events[evt] = events[evt] || []
        events[evt].push({
          handler: handler
        })
      }
    
      function fire(evt,args){
        if(!events[evt]){return}
        for(var i = 0; i < events[evt].length; i++){
          events[evt][i].handler(args)
        }
      }
    
      function off(evt){
        delete events[evt]
      }
    
      return {
        on: on,
        fire: fire,
        off: off
      }
    })()
    
    Event.on('change',function(){
      console.log('change...  now val is ' + val)
    })  //完成订阅
    
    Event.fire('change', '饥人谷')  //发布,执行函数,输出change...  now val is 饥人谷
    
    Event.off('change')  //移除订阅
    Event.fire('change')  //由于移除订阅,此时没有输出,返回undefined
    

    相关文章

      网友评论

        本文标题:前端设计模式

        本文链接:https://www.haomeiwen.com/subject/zmdhjxtx.html