《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 相关文章推荐
监控 url fragment变化的js代码
Apr 19 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
Sep 09 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
Sep 13 Javascript
微信小程序 删除项目工程实现步骤
Nov 10 Javascript
javascript表单正则应用
Feb 04 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
Feb 20 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
微信JS SDK接入的几点注意事项(必看篇)
Jun 23 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 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的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python 队列详解及实例代码
2016/10/18 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
初入社会应届生求职信
2013/11/18 职场文书
总账会计岗位职责
2014/03/13 职场文书
争先创优心得体会
2014/09/12 职场文书
作风建设整改方案
2014/10/27 职场文书
总经理岗位职责
2015/02/04 职场文书
母亲节寄语大全
2015/02/27 职场文书
档案工作个人总结
2015/03/03 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
Python如何识别银行卡卡号?
2021/06/10 Python
mysq启动失败问题及场景分析
2021/07/15 MySQL
Java实现学生管理系统(IO版)
2022/02/24 Java/Android