本文实例讲述了JavaScript设计模式之代理模式。分享给大家供大家参考,具体如下:
代理模式的定义,代理是一个对象(代理)用它来控制目标对象的访问。为此他要是先与目标对象相同的接口,但是他不同于装饰者模式,它对目标对象不进行任何修改,它的目的在于延缓”复杂”对象的初始化时间。这样可以在用到这个目标对象的时候再初始化他(对于单例来讲更是重要)。
<强>代理模式有两种分类:强>
(1)普通代理
(2)惰性代理
具体看下面的例子
步骤一,接口检验文件的引用
//定义一个静态方法来实现接口与实现类的直接检验//静态方法不要写出接口。原型,因为这是写到接口的原型链上的//我们要把静态的函数直接写到类层次上//定义一个接口类 var=function接口(名称、方法){//名称:接口名字 如果(arguments.length<2) { alert("必须是两个参数”) } this.name=名称; this.methods=[];//定义一个空数组装载函数名 我(var=0; i< methods.length;我+ +){ 如果(typeof方法[我]!=白址?{ alert("函数名必须是字符串类型”); 其他}{ this.methods。推动(方法[我]); } } }; 接口。ensureImplement=function(对象){ 如果(arguments.length<2) { 把新的错误(“参数必须不少于2个) 返回错误; } (var i=1; i< arguments.length;我+ +){ var国米=参数[我];//如果是接口就必须是接口类型 如果(inter.constructor !=接口){ 把新的错误(“如果是接口类的话,就必须是接口类型”); }//判断接口中的方法是否全部实现//遍历函数集合分析 (var j=0; j< inter.methods.length; j + +) { var方法=inter.methods [j];//接口中所有函数//对象[方法]传入的函数//最终是判断传入的函数是否与接口中所用函数匹配 如果(!对象[方法]| | typeof对象[方法]!="函数"){//实现类中必须有方法名字与接口中所用方法名相同 把新的错误(“实现类中没有完全实现接口中的所有方法”) } } } } >之前步骤,二目标类
(1)图书类
//图书类/* *投标图书id * bName图书名称 * bPrice图书价格 * */var书=function(报价,bName bPrice) { 这一点。=报价; 这一点。bName=bName; 这一点。bPrice=bPrice; } >之前(2)真正的目标类
//目标类 var myBookShop=(函数(){//书店里的书 var书={}; 返回函数(noble) {//初始化 如果(typeof noble==岸韵蟆?{ 书=商品; }//加书 这一点。用于将=函数(书){ 书(书。投标]=书; }//找书 这一点。findBook=函数(投标){ 如果(书籍(投标)){ 返回书(报价); 其他}{ 返回null; } }//还书 这一点。returnBook=函数(书){ this.addBook(书); }//借书 这一点。lendBook=函数(投标){ var书=this.findBook(报价); 返回的书; } } })(); >之前步骤三,普通代理
var myBookShopProxy=function (noble) { var obj=new myBookShop (noble);//类似于目标类的引用//加书 这一点。用于将=函数(书){ obj.addBook(书); }//找书 这一点。findBook=函数(投标){ 返回obj.findBook(报价); }//还书 这一点。returnBook=函数(书){ obj.returnBook(书); }//借书 这一点。lendBook=函数(投标){ 返回obj.lendBook(报价); } } >之前步骤四,添加数据后,开始访问
var代理=new myBookShopProxy ({ “001”:新书(“001”、“EXTJS”、“45”), “002”:新书(“002”、“JS”、“60”) }) alert (proxy.lendBook (“001”) .bName) >之前在普通的代理模式中,我们可以看出代理中对目标对象的引用是一次性初始化的,然后再在该基础上实现其他操作
如图:目标类和代理同时实现了同一接口。代理中一次性对目标类进行实例,然后值访问到目标类中的方法。
JavaScript设计模式之代理模式实例分析