阅读 63

JavaScript设计模式——单例模式

单例模式的组成

由普通类和代理类两个部分组成

  • 普通类 CreateDiv,创建div并添加到body中

var CreateDiv = function (html) {   this.html = html;   this.init(); }; CreateDiv.prototype.init = function () {   var div = document.createElement('div');   div.innerHTML = this.html;   document.body.appendChild(div); }; 复制代码

  • 代理类,判断是否单例

var ProxySingletonCreateDiv = (function () {   var instance;   return function (html) {     if (!instance) {       instance = new CreateDiv(html);     }     return instance;   }; })(); 复制代码

最终效果

var d2 = new ProxySingletonCreateDiv('d2'); var d1 = new ProxySingletonCreateDiv('d1'); 复制代码

页面上只有一个div(d2)

惰性单例模式

登录框通常只有一个,且第一次点击登录的时候创建。

<button id="loginBtn">登录</button> <script>   var createLoginLayer = function () {     var div = document.createElement('div');     div.innerHTML = '我是登录框';     div.style.display = 'none';     document.body.appendChild(div);     return div;   };   var getSingle = function (fn) {     var instance;     return function () {       if (!instance) {         instance = fn.apply(this, arguments);       }       return instance;     };   };   var createSingleLoginLayer = getSingle(createLoginLayer);   document.getElementById('loginBtn').onclick = function () {     loginLayer = createSingleLoginLayer();     loginLayer.style.display = 'block';   }; </script> 复制代码

应用例子 - 实现jQuery的one方法

即元素绑定的方法值运行一次

<button>只打印一次log</button> 复制代码

function getSingle(fn) {   var instance;   return function () {     return instance || (instance = fn.apply(this, arguments));   }; } function logBtn() {   console.log('点击一次btn');   return true; } var onceLog = getSingle(logBtn); document.querySelector('button').onclick = () => {   onceLog(); };


作者:人间烟火579
链接:https://juejin.cn/post/7022838418392645669


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐