《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下IE与FF兼容函数收集
Sep 17 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
Jul 02 Javascript
用js实现in_array的方法
Nov 05 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
jquery实现用户登陆界面(示例讲解)
Sep 06 jQuery
基于bootstrop常用类总结(推荐)
Sep 11 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
Jun 11 Javascript
写一个Vue Popup组件
Feb 25 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 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 eval函数使用介绍
2013/12/08 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
JavaScript中的作用域链和闭包
2012/06/30 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
python统计cpu利用率的方法
2015/06/02 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
Python内置函数property()如何使用
2020/09/01 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
Laravel中Kafka的使用详解
2021/03/24 PHP
校园之星获奖感言
2014/01/29 职场文书
民间借贷被告代理词
2015/05/23 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript