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

JS實現(xiàn)單例模式的N種方案

 更新時間:2022年09月13日 16:23:16   作者:粥里有勺糖  
JS實現(xiàn)單例模式的多種方案 ,本文稍加總結(jié),列出了6種方式與大家分享,大體上將內(nèi)容分為了ES5(Function)與ES6(Class)實現(xiàn)兩種部分,對js單例模式相關(guān)知識感興趣的朋友跟隨小編一起看看吧

JS實現(xiàn)單例模式的多種方案 ,本文稍加總結(jié),列出了6種方式與大家分享,大體上將內(nèi)容分為了ES5(Function)與ES6(Class)實現(xiàn)兩種部分

JS實現(xiàn)單例模式的多種方案

今天在復習設計模式中的-創(chuàng)建型模式,發(fā)現(xiàn)JS實現(xiàn)單例模式的方案有很多種,稍加總結(jié)了一下,列出了如下的6種方式與大家分享

大體上將內(nèi)容分為了ES5(Function)與ES6(Class)實現(xiàn)兩種部分

單例模式的概念

  • 一個實例只生產(chǎn)一次
  • 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點

方式1

利用instanceof判斷是否使用new關(guān)鍵字調(diào)用函數(shù)進行對象的實例化

function User() {
    if (!(this instanceof User)) {
        return
    }
    if (!User._instance) {
        this.name = '無名'
        User._instance = this
    }
    return User._instance
}

const u1 = new User()
const u2 = new User()

console.log(u1===u2);// true

方式2

在函數(shù)上直接添加方法屬性調(diào)用生成實例

function User(){
    this.name = '無名'
}
User.getInstance = function(){
    if(!User._instance){
        User._instance = new User()
    }
    return User._instance
}

const u1 = User.getInstance()
const u2 = User.getInstance()

console.log(u1===u2);

方式3

使用閉包,改進方式2

function User() {
    this.name = '無名'
}
User.getInstance = (function () {
    var instance
    return function () {
        if (!instance) {
            instance = new User()
        }
        return instance
    }
})()

const u1 = User.getInstance()
const u2 = User.getInstance()

console.log(u1 === u2);

方式4

使用包裝對象結(jié)合閉包的形式實現(xiàn)

const User = (function () {
    function _user() {
        this.name = 'xm'
    }
    return function () {
        if (!_user.instance) {
            _user.instance = new _user()
        }
        return _user.instance
    }
})()

const u1 = new User()
const u2 = new User()

console.log(u1 === u2); // true

當然這里可以將閉包部分的代碼單獨封裝為一個函數(shù)

在頻繁使用到單例的情況下,推薦使用類似此方法的方案,當然內(nèi)部實現(xiàn)可以采用上述任意一種

function SingleWrapper(cons) {
    // 排除非函數(shù)與箭頭函數(shù)
    if (!(cons instanceof Function) || !cons.prototype) {
        throw new Error('不是合法的構(gòu)造函數(shù)')
    }
    var instance
    return function () {
        if (!instance) {
            instance = new cons()
        }
        return instance
    }
}

function User(){
    this.name = 'xm'
}
const SingleUser = SingleWrapper(User)
const u1 = new SingleUser()
const u2 = new SingleUser()
console.log(u1 === u2);

方式5

在構(gòu)造函數(shù)中利用new.target判斷是否使用new關(guān)鍵字

class User{
    constructor(){
        if(new.target !== User){
            return
        }
        if(!User._instance){
            this.name = 'xm'
            User._instance = this
        }
        return User._instance
    }
}

const u1 = new User()
const u2 = new User()
console.log(u1 === u2);

方式6

使用static靜態(tài)方法

class User {
    constructor() {
        this.name = 'xm'
    }
    static getInstance() {
        if (!User._instance) {
            User._instance = new User()
        }
        return User._instance
    }
}
const u1 = User.getInstance()
const u2 = User.getInstance()

console.log(u1 === u2);

到此這篇關(guān)于JS實現(xiàn)單例模式的N種方案的文章就介紹到這了,更多相關(guān)js單例模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 理解 javascript 中的函數(shù)表達式與函數(shù)聲明

    理解 javascript 中的函數(shù)表達式與函數(shù)聲明

    這篇文章主要介紹了理解 javascript 中的函數(shù)表達式與函數(shù)聲明,需要的朋友可以參考下
    2017-07-07
  • 利用ES6實現(xiàn)單例模式及其應用詳解

    利用ES6實現(xiàn)單例模式及其應用詳解

    單例是在程序設計非常基礎的東西,這篇文章主要給大家介紹了關(guān)于利用ES6實現(xiàn)單例模式及其應用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-12-12
  • 微信小程序報錯: thirdScriptError的錯誤問題

    微信小程序報錯: thirdScriptError的錯誤問題

    這篇文章主要介紹了微信小程序報錯: thirdScriptError,本文給大家分享解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • JavaScript表單驗證實例之驗證表單項是否為空

    JavaScript表單驗證實例之驗證表單項是否為空

    表單驗證幾乎在每個需要注冊或者是登錄的網(wǎng)站都是必不可少,下面通過本篇文章給大家介紹JavaScript表單驗證實例之驗證表單項是否為空,涉及到js表單驗證實例相關(guān)知識,對js表單驗證實例代碼需要的朋友一起學習吧
    2016-01-01
  • JavaScript的Proxy可以做哪些有意思的事兒

    JavaScript的Proxy可以做哪些有意思的事兒

    這篇文章主要介紹了JavaScript的Proxy可以做哪些有意思的事兒,Proxy是ES6中提供的新的API,可以用來定義對象各種基本操作的自定義行為 (在文檔中被稱為traps,我覺得可以理解為一個針對對象各種行為的鉤子),,需要的朋友可以參考下
    2019-06-06
  • trim原型函數(shù)看js正則表達式的性能

    trim原型函數(shù)看js正則表達式的性能

    如果你看到別人寫trim函數(shù)是用循環(huán)而不用正則表達式來寫,請不要取笑,也許,他們就是高手。如果你很自信你的trim函數(shù)效率很高,請看完本文再下結(jié)論。
    2008-12-12
  • js中比較兩個對象是否相同的方法示例

    js中比較兩個對象是否相同的方法示例

    這篇文章主要介紹了js中比較兩個對象是否相同的方法,結(jié)合實例形式詳細分析了js對象遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • js在輸入框屏蔽按鍵,只能鍵入數(shù)字的示例代碼

    js在輸入框屏蔽按鍵,只能鍵入數(shù)字的示例代碼

    本篇文章主要介紹了js在輸入框屏蔽按鍵,只能鍵入數(shù)字的示例代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • fullCalendar日歷插件玩法示例解析

    fullCalendar日歷插件玩法示例解析

    這篇文章主要介紹了fullCalendar日歷插件玩法示例解析,包括Fullcalendar安裝,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • echarts X軸顯示不全的處理方法(顯示完全以及換行)

    echarts X軸顯示不全的處理方法(顯示完全以及換行)

    我們在echarts表中經(jīng)常會出現(xiàn)X軸的信息顯示不完全的情況,所以本文小編給大家介紹了echarts X軸顯示不全的處理方法,文中通過代碼示例給大家介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-01-01

最新評論

闽清县| 富裕县| 兴安县| 南乐县| 芮城县| 屯门区| 尼勒克县| 临夏市| 西乡县| 酒泉市| 顺平县| 山东省| 喀什市| 罗江县| 淮安市| 连城县| 林州市| 岚皋县| 绥德县| 墨脱县| 林甸县| 固阳县| 英吉沙县| 惠州市| 贵定县| 衡东县| 财经| 黄陵县| 定兴县| 安宁市| 颍上县| 临漳县| 连平县| 荥阳市| 皋兰县| 岳阳县| 宽城| 江山市| 元谋县| 砀山县| 临桂县|