《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 相关文章推荐
使用js修改客户端注册表的方法
Aug 09 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
AngularJS 输入验证详解及实例代码
Jul 28 Javascript
Layui数据表格之获取表格中所有的数据方法
Aug 20 Javascript
vue.extend与vue.component的区别和联系
Sep 19 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
Jul 24 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
Vue-resource安装过程及使用方法解析
Jul 21 Javascript
js实现批量删除功能
Aug 27 Javascript
javascript实现固定侧边栏
Feb 09 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
php中cookie的作用域
2008/03/27 PHP
php echo 输出字符串函数详解
2010/05/13 PHP
PHP基础知识介绍
2013/09/17 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
通过C++学习Python
2015/01/20 Python
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
python实现图片压缩代码实例
2019/08/12 Python
Python单元测试与测试用例简析
2019/11/09 Python
如何在python中判断变量的类型
2020/07/29 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
英国综合网上购物商城:The Hut
2018/07/03 全球购物
质量安全标语
2014/06/07 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
销售工作决心书
2015/02/04 职场文书
朋友离别感言
2015/08/04 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
Python实现信息管理系统
2022/06/05 Python