《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 多种搜索引擎集成的页面实现代码
Jan 02 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
基于Vuejs实现购物车功能
Aug 02 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
Sep 14 Javascript
jQuery通过ajax快速批量提交表单数据
Oct 25 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 jQuery
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
在react中使用vue的状态管理的方法示例
May 02 Javascript
基于Vue CSR的微前端实现方案实践
May 27 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
Nov 16 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
yii去掉必填项中星号的方法
2015/12/28 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
angular select 默认值设置方法
2017/06/23 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python基础教程之自定义函数介绍
2014/08/29 Python
python3实现点餐系统
2019/01/24 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
Oracle快照(snapshot)
2015/03/13 面试题
优秀员工自荐书
2013/12/19 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
事业单位聘任报告
2015/03/02 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
vue使用element-ui按需引入
2022/05/20 Vue.js
python读取mat文件生成h5文件的实现
2022/07/15 Python