《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-$.extend扩展方法使方法参数更灵活
Jan 15 Javascript
jquery重新播放css动画所遇问题解决
Aug 21 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 Javascript
JavaScript利用正则表达式去除日期中的“-”
Jul 01 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
Nov 25 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
js 实现省市区三级联动菜单效果
Feb 20 Javascript
基于JavaScript实现焦点图轮播效果
Mar 27 Javascript
微信小程序实现上传图片功能
May 28 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
Dec 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
PHP中cookies使用指南
2007/03/16 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
简单实现python数独游戏
2018/03/30 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python随机模块random使用方法详解
2020/02/14 Python
python中pdb模块实例用法
2021/01/15 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
房地产还款计划书
2014/01/10 职场文书
20岁生日感言
2014/01/13 职场文书
新学期班主任寄语
2014/01/18 职场文书
品牌推广策划方案
2014/05/28 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
初中家长评语和期望
2014/12/26 职场文书
医生个人年终总结
2015/02/28 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书