《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选择符快速提取web表单数据示例
Mar 27 Javascript
js中精确计算加法和减法示例
Mar 28 Javascript
在Linux上用forever实现Node.js项目自启动
Jul 09 Javascript
JavaScript中数据结构与算法(一):栈
Jun 19 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
Jul 27 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
JavaScript的this关键字的理解
Jun 18 Javascript
js canvas实现擦除动画
Jul 16 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
Mar 02 Javascript
JavaScript实现alert弹框效果
Nov 19 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扩展ZF――Validate扩展
2008/01/10 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
安全检查管理制度
2014/02/02 职场文书
成人继续教育实施方案
2014/03/01 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
书香家庭事迹材料
2014/05/09 职场文书
求职信怎么写
2014/05/23 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
2015年小学辅导员工作总结
2015/05/27 职场文书
2015入党自传格式范文
2015/06/26 职场文书
小学作文之描写天气
2019/08/15 职场文书
七年级作文之游记
2019/12/11 职场文书
mysql查看表结构的三种方法总结
2022/07/07 MySQL