美文网首页
用闭包实现面向对象系统

用闭包实现面向对象系统

作者: yongningfu | 来源:发表于2017-03-20 15:15 被阅读0次

闭包实现面向对象设计

闭包的思想是: 一个函数想用一个引用一个外部变量,但是有不想让这个变量暴露在全局环境中,那么就使用闭包。闭包一般有两种使用形式,一个是立即执行的闭包,一种是用时执行的闭包。两种有和区别呢?
立即执行的闭包,用于全局创建一个闭包对象
用时执行的闭包,可用于全局创建多个闭包对象

//立即执行的模式
var matchEmail = (function() {
  var regx = /^\w+(\.\w+)*@\w+\.\w{2,3}(\.\w{2,3})?$/;
  return function(email) {
      return regx.test(email);
  }
})();

console.log(matchEmail('535.fu@qq.com'));

//用时执行的模式

var matchEmail2 = function() {
  var regx = /^\w+(\.\w+)*@\w+\.\w{2,3}(\.\w{2,3})?$/;
  return function(email) {
      return regx.test(email);
  }
}

var matchEmail2 = matchEmail2();
console.log(matchEmail('535.fu@qq.com'));

两者有啥区别呢?容易看出,用时执行模式,每次在创建一个新的matchEmail2时候,都会新建一个闭包,和创建一个新的 regx
立即执行啥时候用呢? 一般是在封装的遍历在函数引用中都是有同一个时,如果不同情况需要使用多个,那么使用 用时执行
很显然,我们如果想要创建一个对象系统的话,需要用用时执行模式

var Events = function() {
  var handlers = {};
  var subscribe = function(type, handler) {
    if (!handlers[type]) {
      handlers[type] = [];
    }
    handlers[type].push(handler);

    //存储当前这个handler是否被订阅
    var isSubscribed = true;
    //每次执行一个订阅函数,返回一个取消订阅回调,只要使用这个函数,那么就取消
    return function unsubscribe() {
      if (!isSubscribed) return; //防止多次执行
      isSubscribed = false;
      const index = handlers[type].indexOf(handler);
      handlers[type].splice(index, 1);
    }
  }

  function dispatch(type) {
    if (handlers[type]) {
      for (let i = 0; i < handlers[type].length; i++) {
        handlers[type][i]();
      }
    }
  }


  //闭包对象系统,返回一个对象
  return {
    subscribe,
    dispatch
  }
}

//创建一个event对象
var event = Events();
//创建另外一个event对象
var event1 = Events();

var unSubscribe = event.subscribe('click', function() {console.log('event click')});
event1.subscribe('click', function() {console.log('event1 click')});


event.dispatch('click');
event1.dispatch('click');
unSubscribe();
event.dispatch('click');

上面创建的两个对象 event event1 互不干扰
利用闭包创建对象系统的话,利用闭包封装想用的局部变量,然后返回一个对象,对象里面是向外提供的接口

tips:上面的订阅一个函数,然后返回一个取消点阅函数,也是一种非常不错的发布 取消点阅模式中的编程思想哦,利用闭包,在订阅的时候就封闭了订阅时的函数,那么取消点阅的时候,就一定能访问到这个函数

相关文章

  • 用闭包实现面向对象系统

    闭包实现面向对象设计 闭包的思想是: 一个函数想用一个引用一个外部变量,但是有不想让这个变量暴露在全局环境中,那么...

  • 闭包和面向对象设计

    闭包: 面向对象:

  • 闭包与面向对象设计

    闭包 面向对象 或者

  • Swift入门二(对象函数)

    函数 闭包 GCD 尾随闭包 闭包循环引用解决(OC) 闭包循环引用解决(swift推荐) 面向对象 命名空间: ...

  • 面向对象闭包

    面向对象备份指针 // this在事件指令中指向事件源 // that称为备份指针 var that = this...

  • 面向对象,闭包

    (1)通过标签获取元素 do...while循环 定时器在javascript中的作用 1、制作动画2、异步操作3...

  • 面向对象、闭包

    变量的作用域 变量作用域指的是变量的作用范围,javascript 中的变量分为全局变量和局部变量; 1.全局变量...

  • 面向对象闭包

    面向对象备份指针 // this在事件指令中指向事件源 // that称为备份指针 var that = this...

  • javascript模块研究之 - 闭包实现

    前言 - 为什么要闭包 我高度概括几点吧 实现面向对象 类代码便于阅读代码之间不会互相污染提高复用性 单例闭包 代...

  • 2018-06-27

    JavaScript(面向对象+原型理解+继承+作用域链和闭包+this使用总结) 一、面向对象 1、什么是面向对...

网友评论

      本文标题:用闭包实现面向对象系统

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