绝妙的函数:模块模式

2019-04-13  本文已影响0人  喜欢唱歌的小狮子Shio

Awesome Function: module pattern

在线演示

利用函数的闭包不仅可以非常轻松地实现模块模式,并且可以自己创建一个模块管理器,就这么简单!

// 以下模块的触发方法
moduleX.sayHello()

实现最简单的模块

// 实现最简单的模块
function simpleModule () {
    let sayHello = function sayHello (name) {
        return `Hi, ${name}`
    }
    return {
        sayHello: sayHello
    }
}
var module1 = simpleModule()

实现单例模式的模块

// 实现单例模式的模块
var module2 = (function singleModule () {
    let hello = 'Hi, Module 2'
    let sayHello = function sayHello () {
        return hello
    }
    return {
        sayHello: sayHello
    }
})()

实现保存对模块的内部引用

// 实现保存对模块的内部引用实现保存对模块的内部引用
var module3 = (function storeModule () {
    let store = {}
    let hello = 'Hi, Module 3'
    let sayHello = function sayHello () {
        return store.getHello()
    }
    let getHello = function getHello () {
        return hello
    }
    store = {
        sayHello: sayHello,
        getHello: getHello
    }
    return store
})()

实现一个模块管理器

// 实现一个模块管理器
var ModuleManager = (function moduleManager () {
    let modules = {}
    let register = function register (name, deps, impl) {
        for (let i = 0; i < deps.length; i++) {
            deps[i] = modules[deps[i]]
        }
        modules[name] = impl.apply(impl, deps)
    }
    let get = function get (name) {
        return modules[name]
    }
    return {
        register: register,
        get: get
    }
})()

// 注册不带依赖的模块
ModuleManager.register('module4', [], function () {
    function sayHello (name) {
        return `Hello, ${name || 'module4'}`
    }
    return {
        sayHello: sayHello
    }
})

// 注册带依赖的模块
ModuleManager.register('module5', ['module4'], function (module4) {
    function sayHello (name) {
        return `${module4.sayHello()}, this is Module 5`
    }
    return {
        sayHello: sayHello
    }
})

// 获取模块等待调用
module4 = ModuleManager.get('module4')
module5 = ModuleManager.get('module5')
上一篇 下一篇

猜你喜欢

热点阅读