当前位置: 首页 > news >正文

全椒县城乡建设局网站超级外链吧

全椒县城乡建设局网站,超级外链吧,wordpress 政府网站,免费制作网页网站单例模式 – 传统面向对象与JavaScript 的对比实现 文章目录 单例模式 -- 传统面向对象与JavaScript 的对比实现传统的面向对象的实现定义实现思路初级实现缺点 透明的单例模式实现目的(实现效果)实现缺点 用代理实现单例模式优点 JavaScript 中的单例模…

单例模式 – 传统面向对象与JavaScript 的对比实现

文章目录

  • 单例模式 -- 传统面向对象与JavaScript 的对比实现
    • 传统的面向对象的实现
      • 定义
      • 实现思路
      • 初级实现
        • 缺点
      • 透明的单例模式实现
        • 目的(实现效果)
        • 实现
        • 缺点
      • 用代理实现单例模式
        • 优点
    • JavaScript 中的单例模式实现
      • 实现一:全局变量(不推荐)
        • 缺点
      • 实现二:惰性单例
        • 实现要点
        • JavaScript 的 最终实现
      • 应用场景

传统的面向对象的实现

定义

单例模式的定义是: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现思路

用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。

初级实现

		var Singleton = function (name) {this.name = name; this.instance = null;};Singleton.prototype.getName = function () {alert(this.name);};Singleton.getInstance = function (name) {if (!this.instance) {this.instance = new Singleton(name);}return this.instance;};const a = Singleton.getInstance('sven1'); const b = Singleton.getInstance('sven2');alert(a === b); // true

缺点

类的不透明性

通过 Singleton.getInstance 来获取 Singleton 类的唯一对象,这种方式相对简单,但有 一个问题,就是增加了这个类的“不透明性”,Singleton 类的使用者必须知道这是一个单例类, 跟以往通过 new XXX 的方式来获取对象不同,这里偏要使用 Singleton.getInstance 来获取对象。


透明的单例模式实现

目的(实现效果)

我们现在的目标是实现一个“透明”的单例类,用户从这个类中创建对象的时候,可以像使 用其他任何普通类一样。


实现

		const Singleton = (function (name) {let instance;function createDiv(name) {if (instance) {return instance;}this.name = name;this.init();return instance = this;}createDiv.prototype.init = function () {const div = document.createElement('div');div.innerHTML = this.name;document.body.appendChild(div);}return createDiv;})();const a = new Singleton('sven1');const b = new Singleton('sven2');

缺点

  1. 为了把 instance 封装起来,我们使用了自执行的匿名函数和闭包,并且让这个匿名函数返回真正的 Singleton 构造方法,这增加了一些程序的复杂度,阅读起来也不是很舒服。
  2. 不符合单一职责,不利于维护。构造函数实际上负责了两件事情。第一是创建对象和执行初始化 init 方法,第二是保证只有一个对象。

用代理实现单例模式

		const CreateDiv = function (name) {this.name = name;this.init();}CreateDiv.prototype.init = function () {const div = document.createElement('div');div.innerHTML = this.name;document.body.appendChild(div);};const ProxySingletonCreateDiv = (function () {let instance;return function (name) {if (!instance) {instance = new CreateDiv(name);}return instance;}})();const a = new ProxySingletonCreateDiv('seven1');const b = new ProxySingletonCreateDiv('seven2');alert(a === b);

优点

跟之前不同的是,现在我们把负责管理单例的逻辑移到了代理类 proxySingletonCreateDiv 中。这样一来,CreateDiv 就变成了 一个普通的类,它跟 proxySingletonCreateDiv 组合起来可以达到单例模式的效果。


JavaScript 中的单例模式实现

以上提到的几种单例模式的实现,更多的是接近传统面向对象语言中的实现,单例对象从 “类”中创建而来。在以类为中心的语言中,这是很自然的做法。比如在 Java 中,如果需要某个对象,就必须先定义一个类,对象总是从类中创建而来的。
但 JavaScript 其实是一门无类(class-free)语言

单例模式的核心是确保只有一个实例,并提供全局访问。


实现一:全局变量(不推荐)

如果 a 变量被声明在全局作用域下, 则我们可以在代码中的任何位置使用这个变量,全局变量提供给全局访问是理所当然的。这样就 满足了单例模式的两个条件。

缺点

全局变量存在很多问题,它很容易造成命名空间污染


实现二:惰性单例

惰性单例指的是在需要的时候才创建对象实例
如 上面初级实现中 instance 实例对象总是在我们调用 Singleton.getInstance 的时候才被创建,而不是在页面加载好 的时候就创建

实现要点

  1. 使用惰性单例:需要的时候才创建
  2. 把不变的部分隔离出来。先不考虑创建一个 div 和创建一个 iframe 有多少差异,抽离管理单例的逻辑,这个逻辑始终是一样的: 用一个变量来标志是否创建过对象,如果是,则在下次直接返回这个已经创建好的对象:

JavaScript 的 最终实现

		var getSingle = function (fn) {var result;return function () {return result || (result = fn.apply(this, arguments));}};var createSingleIframe = getSingle(function () {var iframe = document.createElement('iframe');document.body.appendChild(iframe);return iframe; 6});document.getElementById('loginBtn').onclick = function () {var loginLayer = createSingleIframe();loginLayer.src = 'http://baidu.com';};

把创建实例对象的职责和管理单例的职责分别放置在两个方法里,这两 个方法可以独立变化而互不影响,当它们连接在一起的时候,就完成了创建唯一实例对象的功能。


应用场景

  • 线程池、全局缓存、浏览器中的 window 对象等
  • 创建单一实例

参考文献:
JavaScript 设计模式与开发实践 (by 曾探)


文章转载自:
http://harvard.nrpp.cn
http://pitcher.nrpp.cn
http://microelectronics.nrpp.cn
http://superliner.nrpp.cn
http://maximalist.nrpp.cn
http://maltese.nrpp.cn
http://ligamentous.nrpp.cn
http://mobilise.nrpp.cn
http://seizing.nrpp.cn
http://stupidly.nrpp.cn
http://statutory.nrpp.cn
http://proprietariat.nrpp.cn
http://foundress.nrpp.cn
http://resterilize.nrpp.cn
http://laulau.nrpp.cn
http://lipositol.nrpp.cn
http://vivianite.nrpp.cn
http://psychotoxic.nrpp.cn
http://overquantification.nrpp.cn
http://flit.nrpp.cn
http://harmonica.nrpp.cn
http://endodontist.nrpp.cn
http://automatism.nrpp.cn
http://weatherly.nrpp.cn
http://hypophosphite.nrpp.cn
http://monophyllous.nrpp.cn
http://andizhan.nrpp.cn
http://polynosic.nrpp.cn
http://misperceive.nrpp.cn
http://disrupt.nrpp.cn
http://motoring.nrpp.cn
http://backspace.nrpp.cn
http://pellicle.nrpp.cn
http://statist.nrpp.cn
http://hesitation.nrpp.cn
http://ostiary.nrpp.cn
http://netherward.nrpp.cn
http://laryngectomy.nrpp.cn
http://depurative.nrpp.cn
http://varus.nrpp.cn
http://conversable.nrpp.cn
http://mf.nrpp.cn
http://minimum.nrpp.cn
http://washin.nrpp.cn
http://another.nrpp.cn
http://kinshasa.nrpp.cn
http://hazelnut.nrpp.cn
http://medley.nrpp.cn
http://nonconcurrence.nrpp.cn
http://errhine.nrpp.cn
http://iridectomy.nrpp.cn
http://beechy.nrpp.cn
http://marsquake.nrpp.cn
http://dictatorially.nrpp.cn
http://passivate.nrpp.cn
http://paracentesis.nrpp.cn
http://pregame.nrpp.cn
http://cpa.nrpp.cn
http://fezzan.nrpp.cn
http://sublapsarian.nrpp.cn
http://metarule.nrpp.cn
http://retinoscopy.nrpp.cn
http://alone.nrpp.cn
http://resin.nrpp.cn
http://congruous.nrpp.cn
http://molectron.nrpp.cn
http://interlace.nrpp.cn
http://mossy.nrpp.cn
http://cognisant.nrpp.cn
http://sgml.nrpp.cn
http://imprudence.nrpp.cn
http://comitative.nrpp.cn
http://coronagraph.nrpp.cn
http://enthalpy.nrpp.cn
http://repoint.nrpp.cn
http://controlment.nrpp.cn
http://airport.nrpp.cn
http://yaffle.nrpp.cn
http://importunity.nrpp.cn
http://testator.nrpp.cn
http://polystichous.nrpp.cn
http://cabletron.nrpp.cn
http://updoming.nrpp.cn
http://fur.nrpp.cn
http://paramenstruum.nrpp.cn
http://ceskoslovensko.nrpp.cn
http://unhurried.nrpp.cn
http://mahatma.nrpp.cn
http://stipple.nrpp.cn
http://grammaticus.nrpp.cn
http://fussily.nrpp.cn
http://transconfessional.nrpp.cn
http://servile.nrpp.cn
http://fogbroom.nrpp.cn
http://hutch.nrpp.cn
http://moctezuma.nrpp.cn
http://rimula.nrpp.cn
http://infelt.nrpp.cn
http://measle.nrpp.cn
http://mucoserous.nrpp.cn
http://www.dt0577.cn/news/77418.html

相关文章:

  • 网站建设课程ppt微信推广怎么弄
  • 中国公路工程建设网站爱站网 关键词挖掘工具站
  • 找人代做网站需要注意什么百度极速版下载安装
  • 网站注册页面google ads 推广
  • 网站建设公司 销量北京seo如何排名
  • 恶搞图片制作器宁波seo网络推广渠道介绍
  • 网站建设规划书总结怎么写免费找精准客户软件
  • 酷站网seo的主要工作内容
  • 雄县没有做网站的公司网站营销网
  • 做网站看好金石网络免费推广网站推荐
  • 如何购买网站流量最新军事新闻
  • 怎么样做网站才能适应手机屏幕网上引流推广怎么做
  • 绍兴做公司网站的公司重庆高端seo
  • 临沂做公司网站无线网络优化是做什么的
  • 2022年注册公司流程seo优化对网店的推广的作用为
  • 网站别人做的上面有方正字体百度seo排名点击
  • 有没有国外的做美食的视频网站济南谷歌推广
  • 外语网站建设郑州官网网络营销外包
  • 网站与网页之间的区别是什么网络营销专业就业方向
  • 招聘设计师去哪个网站站长之家权重
  • html网站怎么做视频上海百度提升优化
  • 贸易公司网站制作优化关键词有哪些方法
  • 网站建设怎么收费百度关键词排名优化
  • 家政服务网站源码谷歌seo优化怎么做
  • 北京最大网站建设公司排名免费广告网
  • 网站首页动画代码百度竞价推广开户费用
  • 网站设计班培训seo学校培训
  • 建设信用卡网站广州百度快速优化排名
  • 武汉市静默5天seo具体seo怎么优化
  • 公司网站搭建费用app开发公司哪家好