《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 相关文章推荐
JQUERY 浏览器判断实现函数
Aug 20 Javascript
js注意img图片的onerror事件的分析
Jan 01 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
javascript 快速排序函数代码
May 30 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
Sep 01 Javascript
js a标签点击事件
Mar 30 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
vue+element加入签名效果(移动端可用)
Jun 17 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
Apr 20 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
php控制文件下载速度的方法
2015/03/24 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
php实现网页端验证码功能
2017/07/11 PHP
制作特殊字的脚本
2006/06/26 Javascript
学习jquery之一
2007/04/27 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
英文自荐信常用句子
2014/03/26 职场文书
七一党日活动总结
2014/07/08 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
西岭雪山导游词
2015/02/06 职场文书
给病人的慰问信
2015/03/23 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书