JavaScript代理模式原理与用法实例详解


Posted in Javascript onMarch 10, 2020

本文实例讲述了JavaScript代理模式原理与用法。分享给大家供大家参考,具体如下:

代理模式的定义,代理是一个对象(proxy)用它来控制目标对象的访问。为此他要是先与目标对象相同的接口,但是他不同于装饰者模式,它对目标对象不进行任何修改,它的目的在于延缓"复杂"对象的初始化时间。这样可以在用到这个目标对象的时候再初始化他(对于单例来讲更是重要)。

代理模式有两种分类:

(1)普通代理

(2)惰性代理

具体看下面的例子

第一,普通代理模式

步骤一,接口检验文件的引用

//定义一个静态方法来实现接口与实现类的直接检验
//静态方法不要写出Interface.prototype ,因为这是写到接口的原型链上的
//我们要把静态的函数直接写到类层次上
//定义一个接口类
var Interface=function (name,methods) {//name:接口名字
  if(arguments.length<2){
    alert("必须是两个参数")
  }
  this.name=name;
  this.methods=[];//定义一个空数组装载函数名
  for(var i=0;i<methods.length;i++){
    if(typeof methods[i]!="string"){
      alert("函数名必须是字符串类型");
    }else {
      this.methods.push( methods[i]);
    }
  }
};
Interface.ensureImplement=function (object) {
  if(arguments.length<2){
    throw new Error("参数必须不少于2个")
    return false;
  }
  for(var i=1;i<arguments.length;i++){
    var inter=arguments[i];
    //如果是接口就必须是Interface类型
    if(inter.constructor!=Interface){
      throw new Error("如果是接口类的话,就必须是Interface类型");
    }
    //判断接口中的方法是否全部实现
    //遍历函数集合分析
    for(var j=0;j<inter.methods.length;j++){
      var method=inter.methods[j];//接口中所有函数

      //object[method]传入的函数
      //最终是判断传入的函数是否与接口中所用函数匹配
      if(!object[method]||typeof object[method]!="function" ){//实现类中必须有方法名字与接口中所用方法名相同
        throw new Error("实现类中没有完全实现接口中的所有方法")
      }
    }
  }
}

步骤二,目标类

(1)图书类

//图书类
  /*
  * bid 图书id
  * bName 图书名称
  * bPrice 图书价格
  * */
  var Book = function(bid,bName,bPrice){
    this.bid = bid;
    this.bName = bName;
    this.bPrice = bPrice;
  }

(2)真正的目标类

//目标类
  var myBookShop=(function () {
    //书店里的书
     var books={};
     return function (bks) {
       //初始化
       if(typeof bks=="object"){
         books=bks;
       }
       //加书
       this.addBook = function(book){
         books[book.bid] = book;
       }
       //找书
       this.findBook=function (bid) {
         if(books[bid]){
           return books[bid];
         }else {
           return null;
         }
       }
       //还书
       this.returnBook=function (book) {
        this.addBook(book);
       }
       //借书
       this.lendBook=function (bid) {
        var book=this.findBook(bid);
        return book;
       }
     }
  })();

步骤三,普通代理

var myBookShopProxy=function (bks) {
    var obj=new myBookShop(bks);//类似于目标类的引用
     //加书
    this.addBook=function (book) {
      obj.addBook(book);
    }
    //找书
    this.findBook = function(bid){
      return obj.findBook(bid);
    }
    //还书
        this.returnBook=function (book) {
          obj.returnBook(book);
        }
    //借书
    this.lendBook=function (bid) {
      return obj.lendBook(bid);
    }
  }

步骤四,添加数据后,开始访问

var proxy = new myBookShopProxy({
    "001":new Book("001","EXTJS","45"),
    "002":new Book("002","JS","60")
  })
  alert(proxy.lendBook("001").bName)

在普通的代理模式中,我们可以看出代理中对目标对象的引用是一次性初始化的,然后再在该基础上实现其他操作

如图:目标类和代理同时实现了同一接口。代理中一次性对目标类进行实例,然后值访问到目标类中的方法。

JavaScript代理模式原理与用法实例详解

总结,这个代理是我们严格安装定义来写的,一般开发中不会用到,应为他没什么意义。

第二种,惰性代理----在使用时才对目标类进行初始化再引用。

对代理部分的修改如下,其余部分相同,代码如下

//惰性代理---在使用时在初始化目标类的引用
  var myBookShopProxy=function (bks) {
    var obj=null;
    this._init=function () {
      obj=new myBookShop(bks);
    }

    //加书
    this.addBook=function (book) {
      this._init();
      obj.addBook(book);
    }
    //找书
    this.findBook=function (bid) {
      this._init();
      obj.findBook(bid);
    }
    //还书
     this.returnBook=function (book) {
       this._init();
       obj.returnBook(book);
     }
     //借书
    this.lendBook=function (bid) {
      this._init();
     return  obj.lendBook(bid);
    }
  }

修改后的代理执行过程,如图

JavaScript代理模式原理与用法实例详解

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
有效的捕获JavaScript焦点的方法小结
Oct 08 Javascript
js操作select控件的几种方法
Jun 02 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
Jun 29 Javascript
ExtJS DOM元素操作经验分享
Aug 28 Javascript
JavaScript中的立即执行函数表达式介绍
Mar 15 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
js严格模式总结(分享)
Aug 22 Javascript
ES6中Symbol类型用法实例详解
Apr 06 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
Jun 04 Javascript
webpack 从指定入口文件中提取公共文件的方法
Nov 13 Javascript
教你完全理解ReentrantLock重入锁
Jun 03 Javascript
JavaScript命令模式原理与用法实例详解
Mar 10 #Javascript
JavaScript实现指定数量的并发限制的示例代码
Mar 10 #Javascript
vue中的使用token的方法示例
Mar 10 #Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 #Javascript
JS如何在数组指定位置插入元素
Mar 10 #Javascript
vue实现简单瀑布流布局
May 28 #Javascript
JavaScript观察者模式原理与用法实例详解
Mar 10 #Javascript
You might like
PHP实现二维数组去重功能示例
2017/01/12 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
python代码编写计算器小程序
2020/03/30 Python
使用python turtle画高达
2020/01/19 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
python如何编写win程序
2020/06/08 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Django xadmin安装及使用详解
2020/10/26 Python
电子商务专业个人的自我评价分享
2013/10/29 职场文书
军训自我鉴定100字
2014/02/13 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python