《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 进度条效果实现代码整理
May 21 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
Dec 31 Javascript
js带点自动图片轮播幻灯片特效代码分享
Sep 07 Javascript
基于javascript实现图片切换效果
Apr 17 Javascript
Vue.js如何优雅的进行form validation
Apr 07 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
json前后端数据交互相关代码
Sep 19 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
p5.js绘制旋转的正方形
Oct 23 Javascript
JavaScript组合继承详解
Nov 07 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
我的论坛源代码(十)
2006/10/09 PHP
Windows下的PHP5.0详解
2006/11/18 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
代码详解Vuejs响应式原理
2017/12/20 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
python 调用c语言函数的方法
2017/09/29 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
财务经理的岗位职责
2013/12/17 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
工程资料员岗位职责
2014/03/10 职场文书
创建文明学校实施方案
2014/03/11 职场文书
银行贷款收入证明
2014/10/17 职场文书
小学元宵节活动总结
2015/02/06 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
js 实现验证码输入框示例详解
2022/09/23 Javascript