《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析


Posted in Javascript onApril 07, 2020

本文实例讲述了Javascript面向对象程序设计单例模式原理与实现方法。分享给大家供大家参考,具体如下:

1.单例模式概述

源自百度百科对于单例模式的定义:

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

在javascript的世界里,其实没有严格的对象和类定义,“一切皆对象”使得javascript中都是对象,不能像java,c++或者php使用特定的方法返回一个实例来实现,因此对javascript来说,我们要创造的是一个“不能被多次实例化的”对象,也就是说只能实例化一次的对象。

2.简单单例模式:

只能实例化一次的对象也就可以使用“对象字面量”的定义方式来实现:

var singleton = {
  attribute:'',
  method:function(){}
}

这样定义的对象,不能使用new singleton的方式来生成另外的对象(不存在prototype和constructor属性)。

3.包含私有成员的单例模式:

如果看过之前的我写的关于类成员的文章,自然的我们就能想到用闭包来实现,既然要用的闭包,那么一定会用到函数和函数返回值,于是,这样的单例模式如下:

var singleton = function(){
  var private_attribute = '';
  functioin private_method(){}
  return {
   public_attribute:'',
   public_method:function(){}
  };
}

还记得匿名函数吗?通常在使用闭包的时候会使用,改进之后如下:

var singleton = (function(){
  var private_attribute = '';
  functioin private_method(){}
  return {
   public_attribute:'',
   public_method:function(){}
  };
})();

4.惰性加载(lazy loading,延迟加载)单例模式

2,3中所示单例模式定义方式都是在定义时创建的单例,这样很浪费内存,如何能在使用的时候才创建(lazy loading,更多的用于图片的延迟加载)呢?所谓惰性加载,也就是先定义,然后在某个地方才创建对象,所以必须要使用函数,我们知道在java或者php中单例模式通常使用一个静态方法来创建,同理,我们再改进一下闭包形式的定义式:

var singleton = (function(){
  var unique;
  function getinstance(){
    if(!unique){
      unique = construct();
      return unique;
    }
  }
  function construct(){
    var private_member;
    function private_method(){}
    return {//这里才是真正的单例对象
      public_member:'',
      public_method:function(){}
    };
})();

这样调用一个单例对象的方法:

singleton.getinstance().publicmethod();

这样只有在调用方法或引用属性的时候才会真正的创建unique对象,就是使用的时候比较麻烦:)

5.简单mvc代码风格

顺便在这里分享一下我写js的一个简单风格,尽管js是一个前台代码,但是就其本身而言,也可以将它的内容分为mvc(model,controller,view,关于mvc的概念请baidu/google),因此在写一个页面的js代码的时候,我会这么写:

//函数封装在此
var controller = {
  init:function(){}
};
//页面相关内容封装在此
var view = {
  table:{},
  banner:{},
  foot:{}
};
//数据相关内容封装在此
var model = {
  table_data:{}
}

在页面onload的时候调用controoler.init();完成初始化工作(数据加载,页面渲染,事件监听等),这样写的目的是尽量将一些相同的逻辑组织在一起,方便查找和修改,目前只是一个雏形,希望在看完《javascript设计模式》这本书之后能写一个轻量级的模型出来^_^

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
Mar 01 Javascript
JavaScript 实现类的多种方法实例
May 01 Javascript
JS字符串处理实例代码
Aug 05 Javascript
javascript中处理时间戳为日期格式的方法
Jan 02 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
详解JS-- 浮点数运算处理
Nov 28 Javascript
jQuery实现点击图标div循环放大缩小功能
Sep 30 jQuery
Vue Extends 扩展选项用法完整实例
Sep 17 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
Oct 27 Javascript
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
解析原生JS getComputedStyle
May 25 Javascript
flexible.js实现移动端rem适配方案
Apr 07 #Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
Apr 07 #Javascript
详解vue-flickity的fullScreen功能实现
Apr 07 #Javascript
小谈angular ng deploy的实现
Apr 07 #Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 #Javascript
vue开发中遇到的问题总结
Apr 07 #Javascript
手把手教您实现react异步加载高阶组件
Apr 07 #Javascript
You might like
构建简单的Webmail系统
2006/10/09 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
innerText 使用示例
2014/01/23 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
js中this用法实例详解
2015/05/05 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
中学实习教师自我鉴定
2013/12/12 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
信息管理专业自荐书
2014/06/05 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
奖学金感谢信
2015/01/21 职场文书
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL