成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

JS實(shí)現(xiàn)單例模式的方式有哪些

本篇內(nèi)容介紹了“JS實(shí)現(xiàn)單例模式的方式有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、嘉黎網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

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

單例模式的概念

  • 一個(gè)實(shí)例只生產(chǎn)一次

  • 保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)

方式1

利用instanceof判斷是否使用new關(guān)鍵字調(diào)用函數(shù)進(jìn)行對(duì)象的實(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)用生成實(shí)例

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

使用閉包,改進(jìn)方式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

使用包裝對(duì)象結(jié)合閉包的形式實(shí)現(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

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

在頻繁使用到單例的情況下,推薦使用類似此方法的方案,當(dāng)然內(nèi)部實(shí)現(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);

“JS實(shí)現(xiàn)單例模式的方式有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

當(dāng)前標(biāo)題:JS實(shí)現(xiàn)單例模式的方式有哪些
分享網(wǎng)址:http://jinyejixie.com/article8/gpgeip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站收錄、網(wǎng)站維護(hù)、網(wǎng)站改版、靜態(tài)網(wǎng)站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
万全县| 饶平县| 江津市| 玉门市| 望城县| 青冈县| 凤台县| 云阳县| 贵溪市| 宁南县| 永清县| 阿巴嘎旗| 商南县| 比如县| 普兰县| 都江堰市| 柯坪县| 得荣县| 栖霞市| 晋江市| 卢龙县| 乌鲁木齐市| 环江| 拉萨市| 乐平市| 陵川县| 清水县| 建平县| 阳朔县| 东丽区| 兴义市| 教育| 龙州县| 静乐县| 泰和县| 什邡市| 澎湖县| 房产| 镶黄旗| 乌拉特中旗| 冕宁县|