前端设计模式

构造函数模式

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,115评论 19 139
  • 一、构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例 单例模式单例就是保证一个类只有一个实...
    任少鹏阅读 403评论 0 0
  • 写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 工厂模式(factory) 缺点...
    放风筝的小小马阅读 362评论 0 2
  • 一、6种设计模式 构造函数constructor模式 构造函数模式是创建特定类型的对象的一种模式,把私有属性绑定到...
    yuhuan121阅读 381评论 0 2
  • 1. 写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 模块模式var Perso...
    _李祺阅读 277评论 0 0