问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在javascript中使用单例模式,出现问题。

发布网友 发布时间:2022-05-14 19:49

我来回答

5个回答

懂视网 时间:2022-05-15 00:10

这篇文章主要介绍了JavaScript实现单例模式实例以及代码讲解,有需要的读者们跟着学习参考下吧。

传统单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现单例核心思想

无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,接下来我们用JavaScript来强行实现这个思路,请看代码:

var Singleton = function( name ){
 this.name = name;
};
Singleton.prototype.getName = function(){   alert ( this.name );
};
Singleton.getInstance = (function(){   var instance = null;
  return function( name ){
          if ( !instance ){
            instance = new Singleton( name );
          }
        return instance;       }
})();

我们通过Singleton.getInstance来获取Singleton类的唯一对象,这样确实是没问题的,但是js本身是没有类这种概念的,所以我们强行用传统单例思想来实现是没有任何意义的,这样的代码又臭又长(其实是我自己看着不舒服嘻嘻嘻)。下面我们使用JavaScript的闭包来实现一个单例,请看代码:

var Createp = (function(){       var instance;
      var Createp = function( html ){           if ( instance ){
            return instance;           }
          this.html = html; this.init();
          return instance = this;
};
Createp.prototype.init = function(){
var p = document.createElement( 'p' );
p.innerHTML = this.html; 
document.body.appendChild( p );
      };
      return Createp; })();
var a = new Createp( 'sven1' ); var b = new Createp( 'sven2' );
alert ( a === b ); // true

可以看到,这样我们确实用闭包来实现了一个单例,但这个代码还是高度耦合的,Createp的构造函数实际上负责了两件事情。第一是创建对象和执行初始化init方法,第二是保证只有一个对象。这样的代码是职责不明确的,现在我们要把这两个工作分开,构造函数就负责构建对象,至于判断是返回现有对象还是构造新的对象并返回,我们交给另外一个函数去完成,其实也就是为了满足一个编程思想:单一职责原则。这样的代码才能更好的解耦,请看下面代码:

var Createp = function (html) {
 this.html = html;
 this.init();
 };
 Createp.prototype.init = function () {
 var p = document.createElement('p');
 p.innerHTML = this.html;
 document.body.appendChild(p);
 };
 var ProxySingletonCreatep = (function () {
 var instance;
 return function (html) {
 if (!instance) {
 instance = new Createp(html);
 }
 return instance;
 }
 })();
 var a = new ProxySingletonCreatep('sven1');
 var b = new ProxySingletonCreatep('sven2');
 alert(a === b); //true

可以看到,现在我们的构造函数Createp现在只负责构造对象,至于是返回现有对象还是构造新的对象并返回,这件事我们交给了代理类proxySingletonCreatep来处理,这样的代码看着才舒(zhuang)服(bi)嘛!

最后贴一个高度抽象的单例模式代码,惰性单例的精髓!

//单例模式抽象,分离创建对象的函数和判断对象是否已经创建
 var getSingle = function (fn) {
 var result;
 return function () {
 return result || ( result = fn.apply(this, arguments) );
 }
 };

形参fn是我们的构造函数,我们只要传入任何自己需要的构造函数,就能生成一个新的惰性单例。比如说传入创建一个女朋友的构造函数,并且调用getSingle(),就能生成一个新的女朋友。如果以后再调getSingle(),也只会返回刚才创建的那个女朋友。至于新女朋友——不存在的。

单例常用场景

只需要生成一个唯一对象的时候,比如说页面登录框,只可能有一个登录框,那么你就可以用单例的思想去实现他,当然你不用单例的思想实现也行,那带来的结果可能就是你每次要显示登陆框的时候都要重新生成一个登陆框并显示(耗费性能),或者是不小心显示出了两个登录框。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在nodejs+express中如何实现文件上传

在Vue+SpringBoot中如何实现博客管理平台

在nodejs中如何解决超出最大的调用栈错误

在Vue中有关于异步组件的示例

在Vue.js中如何实现组件间循环引用

如何实现动画效果及回调函数

使用jQuery操作table如何实现单元格合并

在vue-router中如何实现路由传参

热心网友 时间:2022-05-14 21:18

好像 似乎 大概 是这个样子滴 匿名函数问题:
把 window["lib"]["lognMole"] =(function(){code})();
改成window["lib"]["lognMole"] =(function(){code});
不要最后那个括号,最后那个括号表示执行该返回的函数;
你只是让window.lib.lognMole对该函数的引用,而不是引用执行完了的结果。

热心网友 时间:2022-05-14 22:36

return 后不要直接换行,js程序行结束是不需要分号的,要换行了,就直接return了,也就是return undefined了,改成这样
return {
getInstance: function () {
if (!uniqueLogn) {
uniqueLogn = constructor();
}
}
}

热心网友 时间:2022-05-15 00:11

你这个代码不止是换行的问题,各种问题都有。附上代码:
<script type="text/javascript">

window["lib"] = {};
window["lib"]["lognMole"] = (function () {

var uniqueLogn = 1;
var test = 0;
function constructor() {
var lognHtml = "<div id='light' class='white_content'>rerr</div>";
return lognHtml;
}

return {
getInstance: function () {
if (uniqueLogn) {
return uniqueLogn = constructor();
}
}
}

//alert(1);

})();

var contentDiv = document.createElement('div');
document.body.appendChild(contentDiv); //把div添加到body
contentDiv.innerHTML = lib.lognMole.getInstance();
</script>

热心网友 时间:2022-05-15 02:02

return后不要换行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
锅炉切圆直径调整 为什么我打开excel后是灰色的? 有没有什么值得推荐的投资港股的QDII基金? - 知乎 win10电脑屏幕亮度调不了怎么办 考焊工证具体怎么操作 广汽传祺是丰田技术吗 广汽传祺与广汽丰田有关系吗 怎样才能让不愿写作业的孩子听话? 上初中不写作业不想学习的孩子应该如何管教? 出生在2020年农历七月十二日的宝宝怎么取名有内涵? 多哈回合谈判各方呼吁 为什么说川普是美国最后一任总统 下列各项中属于行为税的有() 通字放后边组词 苹果x系统12.31需要更新到13.5吗? 通字组词有哪些 微信好友被删了,自己又不知道他的了。怎么找回? 微信好友被删了,自己又不知道他的了。怎么找回? 为什么百度又权重,360一点都没有了,360的收录怎么做才好? 光大银行逾期一个月注销卡行不行 怎么把照片放到360隐私保护里 有什办法尽快让360收录 怎么样才能被百度 搜狗 360这种搜索引擎收录!请详细点! 怎么才能被360快速收录? 怎样让自己拍的图片上传到360&#47;百度&#47;搜狗图片大全那里供人查看下载? 失信人能在免税店购买商品吗? 怎么让百度、搜狗、360搜索引擎可以收录图片?图片收录差异很大,应该怎么做呢?谢谢 北京国贸那有免税店嘛 普通人能去买吗 为什么韩国人不都到免税店买东西? 普通人可以去免税店购物吗? 中服免税店普通人可以买吗 可画如何下载素材 可画中简历怎么导出来 在哪能下载儿童画素材? 居民医保政府补助政策是什么 朋友借花呗上的钱借一年后也不还,起诉到*后,*能否同意按花呗的显示金额还款? 我急要一份关于(安防监控)的调查问卷!希望大家帮帮忙 你好,我想问一下中国调查网真的可以赚钱吗 51积分调查网 怎么赚钱啊 你好!我也在玩调查网,分别是第一调查网和91问问。。。但是都没挣到钱,你有更好的调查网吗? 第一调查网,为什么我每次问卷调查都通不过,而且接到的商业调查很少 我要做一个问卷调查的网站~需要用到什么知识~ 黄丫头炖豆腐的做法过年吃什么荤菜 豆腐鱼的做法,黄丫头豆腐鱼怎么做好吃,黄 丫头豆腐鱼怎么做好吃,黄丫头豆腐鱼的家常做法 花壳豆腐汤怎么做好吃 黄丫头鱼可以和什么一起炖,孕妇吃更有营养 javascript 重复打开页面问题 表示爱的词语2字 爱的两字词语 各种爱的2字词语