最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用ES6實(shí)現(xiàn)單例模式及其應(yīng)用詳解

 更新時(shí)間:2017年12月09日 13:46:56   作者:TeanLee  
單例是在程序設(shè)計(jì)非常基礎(chǔ)的東西,這篇文章主要給大家介紹了關(guān)于利用ES6實(shí)現(xiàn)單例模式及其應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

在傳統(tǒng)開(kāi)發(fā)工程師眼里,單例就是保證一個(gè)類只有一個(gè)實(shí)例,實(shí)現(xiàn)的方法一般是先判斷實(shí)例存在與否,如果存在直接返回,如果不存在就創(chuàng)建了再返回,這就確保了一個(gè)類只有一個(gè)實(shí)例對(duì)象。在JavaScript里,單例作為一個(gè)命名空間提供者,從全局命名空間里提供一個(gè)唯一的訪問(wèn)點(diǎn)來(lái)訪問(wèn)該對(duì)象。

單例模式的定義是:保證一個(gè)類僅有一個(gè)一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

單例模式能在合適的時(shí)候創(chuàng)建對(duì)象,并且創(chuàng)建唯一的一個(gè)。

代碼接近于生活,很有意思。比如一個(gè)網(wǎng)站的登錄,點(diǎn)擊登錄后彈出一個(gè)登錄彈框,即使再次點(diǎn)擊,也不會(huì)再出現(xiàn)一個(gè)相同的彈框。又或者一個(gè)音樂(lè)播放程序,如果用戶打開(kāi)了一個(gè)音樂(lè),又想打開(kāi)一個(gè)音樂(lè),那么之前的播放界面就會(huì)自動(dòng)關(guān)閉,切換到當(dāng)前的播放界面。這些都是單例模式的應(yīng)用場(chǎng)景。

要實(shí)現(xiàn)一個(gè)單例模式,一個(gè)經(jīng)典的方式是創(chuàng)建一個(gè)類,類中又一個(gè)方法能創(chuàng)建該類的實(shí)例對(duì)象,還有一個(gè)標(biāo)記,記錄是否已經(jīng)創(chuàng)了過(guò)了實(shí)例對(duì)象。如果對(duì)象已經(jīng)存在,就返回第一次實(shí)例化對(duì)象的引用。

單例模式的實(shí)現(xiàn)

es5實(shí)現(xiàn)方式

var Singleton = function(name) {
 this.name = name;
 //一個(gè)標(biāo)記,用來(lái)判斷是否已將創(chuàng)建了該類的實(shí)例
 this.instance = null;
}
// 提供了一個(gè)靜態(tài)方法,用戶可以直接在類上調(diào)用
Singleton.getInstance = function(name) {
 // 沒(méi)有實(shí)例化的時(shí)候創(chuàng)建一個(gè)該類的實(shí)例
 if(!this.instance) {
  this.instance = new Singleton(name);
 }
 // 已經(jīng)實(shí)例化了,返回第一次實(shí)例化對(duì)象的引用
 return this.instance;
}

用戶可以通過(guò)一個(gè)廣為人知的接口,對(duì)該實(shí)例進(jìn)行訪問(wèn)。

我們嘗試對(duì)該對(duì)象進(jìn)行兩次實(shí)例化,觀察兩次實(shí)例化結(jié)果是否指向同一個(gè)對(duì)象。

var a = Singleton.getInstance('sven1');
var b = Singleton.getInstance('sven2');
// 指向的是唯一實(shí)例化的對(duì)象
console.log(a === b);

返回結(jié)果是:true。說(shuō)明a、b之間是引用關(guān)系。

es6實(shí)現(xiàn)方式

創(chuàng)建Singleton類。class關(guān)鍵字和靜態(tài)函數(shù)都是es6新增的。

class Singleton {
 constructor(name) {
  this.name = name;
  this.instance = null;
 }
 // 構(gòu)造一個(gè)廣為人知的接口,供用戶對(duì)該類進(jìn)行實(shí)例化
 static getInstance(name) {
  if(!this.instance) {
   this.instance = new Singleton(name);
  }
  return this.instance;
 }
}

單例模式應(yīng)用實(shí)例

我們用一個(gè)生活中常見(jiàn)的一個(gè)場(chǎng)景來(lái)說(shuō)明單例模式的應(yīng)用。

任意一個(gè)網(wǎng)站,點(diǎn)擊登錄按鈕,只會(huì)彈出有且僅有一個(gè)登錄框,即使后面再點(diǎn)擊登錄按鈕,也不會(huì)再?gòu)棾龆嘁粋€(gè)彈框。這就是單例模式的典型應(yīng)用。接下來(lái)我們實(shí)現(xiàn)它。為了注重單例模式的展示,我們把登錄框簡(jiǎn)化吧😜

在頁(yè)面上設(shè)置一個(gè)按鈕

<button id="loginBtn">登錄</button>

為這個(gè)按鈕添加點(diǎn)擊事件

const btn = document.getElementById('loginBtn');
btn.addEventListener('click', function() {
 loginLayer.getInstance();
}, false);

我們先給一個(gè)初始化方法init,在點(diǎn)擊按鈕之后,在頁(yè)面上添加一個(gè)框框(權(quán)當(dāng)?shù)卿浛蛄耍?/p>

init() {
 var div = document.createElement('div');
 div.classList.add('login-layer');
 div.innerHTML = "我是登錄浮窗";
 document.body.appendChild(div);
}

那么接下來(lái)要用單例模式實(shí)現(xiàn),點(diǎn)擊按鈕出現(xiàn)有且僅有一個(gè)浮窗,方法就是在構(gòu)造函數(shù)中創(chuàng)建一個(gè)標(biāo)記,第一次點(diǎn)擊時(shí)創(chuàng)建一個(gè)浮窗,用改變標(biāo)記的狀態(tài),再次點(diǎn)擊按鈕時(shí),根據(jù)標(biāo)記的狀態(tài)判斷是否要再創(chuàng)建一個(gè)浮窗。

上源碼:

class loginLayer {
 constructor() {
  // 判斷頁(yè)面是否已有浮窗的標(biāo)記
  this.instance = null;
  this.init();
 }
 init() {
  var div = document.createElement('div');
  div.classList.add('login-layer');
  div.innerHTML = "我是登錄浮窗";
  document.body.appendChild(div);
 }
 // 靜態(tài)方法作為廣為人知的接口
 static getInstance() {
  // 根據(jù)標(biāo)記的狀態(tài)判斷是否要再添加浮窗,如果標(biāo)記不為空就創(chuàng)建一個(gè)浮窗
  if(!this.instance) {
   this.instance = new loginLayer();
  }
  return this.instance;
 }
}

當(dāng)然不要忘記為浮窗添加一個(gè)樣式,讓浮窗顯示啦

.login-layer {
 width: 200px;
 height: 200px;
 background-color: rgba(0, 0, 0, .6);
 text-align: center;
 line-height: 200px;
 display: inline-block;
}

最后奉上該實(shí)例的源碼:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>單例實(shí)現(xiàn)登錄彈窗</title>
 <style>
  .login-layer {
   width: 200px;
   height: 200px;
   background-color: rgba(0, 0, 0, .6);
   text-align: center;
   line-height: 200px;
   display: inline-block;
  }
 </style>
</head>
<body>
 <button id="loginBtn">登錄</button>
 <script>
  const btn = document.getElementById('loginBtn');
  btn.addEventListener('click', function() {
   loginLayer.getInstance();
  }, false);  
  class loginLayer {
   constructor() {
    this.instance = null;
    this.init();
   }
   init() {
    var div = document.createElement('div');
    div.classList.add('login-layer');
    div.innerHTML = "我是登錄浮窗";
    document.body.appendChild(div);
   }
   static getInstance() {
    if(!this.instance) {
     this.instance = new loginLayer();
    }
    return this.instance;
   }
  }
 </script>
</body>
</html>

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 不同編碼的頁(yè)面表單數(shù)據(jù)亂碼問(wèn)題解決方法

    不同編碼的頁(yè)面表單數(shù)據(jù)亂碼問(wèn)題解決方法

    這篇文章主要介紹了不同編碼的頁(yè)面表單數(shù)據(jù)亂碼問(wèn)題解決方法,本文使用一個(gè)表單不常用屬性accept-charset解決了這個(gè)問(wèn)題,需要的朋友可以參考下
    2015-02-02
  • 有趣的bootstrap走動(dòng)進(jìn)度條

    有趣的bootstrap走動(dòng)進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)有趣的bootstrap走動(dòng)進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 用js查找法實(shí)現(xiàn)當(dāng)前欄目的高亮顯示的代碼

    用js查找法實(shí)現(xiàn)當(dāng)前欄目的高亮顯示的代碼

    本文給大家介紹了使用js查找法實(shí)現(xiàn)當(dāng)前欄目的高亮顯示的代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2007-11-11
  • JavaScript實(shí)現(xiàn)的搜索及高亮顯示功能示例

    JavaScript實(shí)現(xiàn)的搜索及高亮顯示功能示例

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)的搜索及高亮顯示功能,涉及javascript字符遍歷與頁(yè)面元素屬性相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 用JS寫(xiě)的簡(jiǎn)單的計(jì)算器實(shí)現(xiàn)代碼

    用JS寫(xiě)的簡(jiǎn)單的計(jì)算器實(shí)現(xiàn)代碼

    參加某公司的面試后,有一機(jī)試題目:用web技術(shù)開(kāi)發(fā)一個(gè)B/S結(jié)構(gòu)的公式解析器。于是想了想思路,神來(lái)一筆想先寫(xiě)個(gè)計(jì)算器程序做基礎(chǔ),于是便寫(xiě)了這個(gè)程序。
    2009-09-09
  • javascript函數(shù)的call、apply和bind的原理及作用詳解

    javascript函數(shù)的call、apply和bind的原理及作用詳解

    javascript函數(shù)的call、apply和bind?本質(zhì)是用來(lái)實(shí)現(xiàn)繼承的,專業(yè)點(diǎn)說(shuō)法就是改變函數(shù)體內(nèi)部this的指向,當(dāng)一個(gè)對(duì)象沒(méi)有某個(gè)功能時(shí),就可以用這3個(gè)來(lái)從有相關(guān)功能的對(duì)象里借用過(guò)來(lái),文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • JavaScript深入淺出__proto__和prototype

    JavaScript深入淺出__proto__和prototype

    這篇文章主要介紹了JavaScript深入淺出__proto__和prototype,文章基于JavaScript的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹。具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • JavaScript設(shè)計(jì)模式之性能優(yōu)化模式享元模式

    JavaScript設(shè)計(jì)模式之性能優(yōu)化模式享元模式

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之性能優(yōu)化模式享元模式,享元設(shè)計(jì)模式是用于性能優(yōu)化的模式,這種設(shè)計(jì)模式的核心在于可以共享技術(shù)并支持對(duì)大量細(xì)分過(guò)后的對(duì)象進(jìn)行調(diào)整,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • 前端實(shí)現(xiàn)word文檔預(yù)覽和內(nèi)容提取的詳細(xì)過(guò)程

    前端實(shí)現(xiàn)word文檔預(yù)覽和內(nèi)容提取的詳細(xì)過(guò)程

    在前端直接讀取并原樣展示W(wǎng)ord文檔是一個(gè)相對(duì)復(fù)雜的任務(wù),因?yàn)閃ord文檔的格式(如.doc或.docx)與Web技術(shù)棧使用的格式(HTML、CSS)不兼容,下面這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)word文檔預(yù)覽和內(nèi)容提取的詳細(xì)過(guò)程,需要的朋友可以參考下
    2024-05-05
  • Web跨瀏覽器進(jìn)程通信(Web跨域)

    Web跨瀏覽器進(jìn)程通信(Web跨域)

    Web跨域已是老生常談的話題,這次來(lái)嘗試下跨域?yàn)g覽器進(jìn)程之間的通信 —— 這在過(guò)去基本依靠網(wǎng)絡(luò)中轉(zhuǎn)實(shí)現(xiàn)
    2013-04-04

最新評(píng)論

桂林市| 长海县| 托克托县| 庄浪县| 南昌县| 太原市| 老河口市| 迁安市| 阜南县| 澄迈县| 肥东县| 南部县| 西昌市| 客服| 宝山区| 靖安县| 德州市| 文登市| 东兴市| 遂昌县| 高雄县| 贵南县| 佛学| 喀喇沁旗| 兴山县| 新安县| 青冈县| 浑源县| 山东省| 通渭县| 天全县| 芜湖县| 拉萨市| 大悟县| 清河县| 青海省| 信丰县| 娄烦县| 梁山县| 巴马| 万源市|