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 相关文章推荐
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
使用Angular.js实现简单的购物车功能
Nov 21 Javascript
纯JS单页面赛车游戏制作代码分享
Mar 03 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
在nginx上部署vue项目(history模式)的方法
Dec 28 Javascript
微信小程序block的使用教程
Apr 01 Javascript
vue实现点击选中,其他的不选中方法
Sep 05 Javascript
Vue组件Draggable实现拖拽功能
Dec 01 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
Oct 30 Javascript
JSONP 的原理、理解 与 实例分析
May 16 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文件操作实现代码分享
2011/09/01 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP设置进度条的方法
2015/07/08 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
浅析python中的分片与截断序列
2016/08/09 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
django框架cookie和session用法实例详解
2019/12/10 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
写好求职信第一句话的技巧
2013/10/26 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
集体婚礼证婚词
2014/01/13 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
MySQL 服务和数据库管理
2021/11/11 MySQL
Python&Matlab实现樱花的绘制
2022/04/07 Python
vue特效之翻牌动画
2022/04/20 Vue.js
python热力图实现的完整实例
2022/06/25 Python