javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧

javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧

ID:30777733

大小:97.23 KB

页数:8页

时间:2019-01-03

javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧_第1页
javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧_第2页
javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧_第3页
javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧_第4页
javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧_第5页
资源描述:

《javascript实现设计模式中的单例模式的一些技巧总结_javascript技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、JavaScript实现设计模式中的单例模式的一些技巧总结一、使用全局变量保存单例这是最简单的实现方法functionPerson(){this.createTime=newDate();}varinstance二newPersonO;functiongetlnstance(){returninstanee;}加载该js时就创建一个Person对象,保存到instance全局变量屮,每次使用都取这个对象。如果一次都没使用,那么创建的这个对彖则浪费了,我们可以优化一下,varinstanccfunctiongetlnstance(){if(!instance){instance二newPers

2、on();}returninstancc;}这样,笫一次使用时才创建对彖。这个方法的缺点是,instance是全局的变量,在多人合作或者开发周期比较长的情况下,很难保证instance不会被其它代码修改或覆盖,很口J能到调用的时候,发现instance根本就不是Person对象。我们考虑下使用闭包来封装起instance,使它不再是全局变量就可以解决这个问题了二、闭包创建对象vargctlnstancc(){varinstanee;returnfunction(){if(!instance){instanee二newPerson();}returninstancc;}}();这样,insta

3、nce就被封装起來了,不用担心被修改了。现在通过gellnslanceO函数可以获得单例了。新的问题,如果我通过newPersonO來创建对象,获得的还是多个对象,javeiscript又不可以像java—样把构造器私有化。那怎么样可以让多次new出来的对彖都是一个实例呢?三、构造函数的静态属性缓存实例先看代码functionPerson(){〃如果已经缓存了实例,则直接返回缓存的实例if(typeofPerson・instance二二二'object'){retuimPerson.instance;}this.createTime二newDate();〃缓存实例Person・instanc

4、e二this;returnthis;}从代码可以看到,第一次new时,if的条件返回false,会往下走,初始化对象,然后保存对象到Person,instance这个静态属性中。第二次new时,if的条件返回true,直接返回Person,instance,不会再往下运行初始化的代码。所以不管new儿次,返冋的都是笫一次创建的对彖。这个方法的缺点和方法一的缺点一样,Person,instance也是公开属性,有可能会被修改。我们参考方法二,使用闭包来封装一个,也许就能解决该问题了四、重写构造函数这个方法要使用闭包,但不能像方法二那么简单,我们需要重写构造函数。〃缓存实例varinstance

5、二this;this.createTime二newDate();//重写构造函数Pcrson=function(){returninstancc;第一次new时,调用原始构造函数先缓存该实例,然后再初始化,同时,重写该构造函数。以后再new时,永远调用不到原始的构造函数了,只能调用到重写后的构造函数,而这个函数总是返回缓存的instance・上面的方法似乎没什么问题,但通过下面的测试,可以发现问题〃向原型添加属性Person.prototype.propl二true;varpl二newPerson();〃在创建初始化对象后,再次向该原型添加屈性Person,prototype.prop2=t

6、rue;varp2二newPerson();〃开始测试console.log(pl.propl);//结果为trueconsole,log(p2.propl);//结果为trueconsole.log(pl.prop2);//结果为undefinedconsole.Iog(p2.prop2);//结杲为undefinedconsole.log(pl.construetor===Person);//结果为falseconsole.Iog(p2.constructor二二二Person);//结果为false我们预期中的结果,应该是全都是truce分析一下上述测试代码Person,prototy

7、pe.propl=true;是在原始构造函数的原型下增加了propl这个属性,并赋值而在执行varpl二newPersonO;之后,Person这个构造函数已经被重写了所以Person,prototype.prop2=true;是在新的原型卜增加prop2这个屈性varp2=newPersonO;p2和pl实际上是同一个对象,即原始构造函数创建的对象所以plp2都有propl这个属性,而没有prop2这个属性

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。