博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 模块模式
阅读量:6802 次
发布时间:2019-06-26

本文共 6818 字,大约阅读时间需要 22 分钟。

1. 对象字面量

1 var myObjectLiteral = {2  3     variableKey: variableValue,4  5     functionKey: function () {6       // ...7     }8 };

示例如下:

1 var myModule = { 2   3   myProperty: "someValue", 4   5   // object literals can contain properties and methods. 6   // e.g we can define a further object for module configuration: 7   myConfig: { 8     useCaching: true, 9     language: "en"10   },11  12   // a very basic method13   saySomething: function () {14     console.log( "Where in the world is Paul Irish today?" );15   },16  17   // output a value based on the current configuration18   reportMyConfig: function () {19     console.log( "Caching is: " + ( this.myConfig.useCaching ? "enabled" : "disabled") );20   },21  22   // override the current configuration23   updateMyConfig: function( newConfig ) {24  25     if ( typeof newConfig === "object" ) {26       this.myConfig = newConfig;27       console.log( this.myConfig.language );28     }29   }30 };31  32 // Outputs: Where in the world is Paul Irish today?33 myModule.saySomething();34  35 // Outputs: Caching is: enabled36 myModule.reportMyConfig();37  38 // Outputs: fr39 myModule.updateMyConfig({40   language: "fr",41   useCaching: false42 });43  44 // Outputs: Caching is: disabled45 myModule.reportMyConfig();
JavaScript对象字面量示例

2. 模块模式

1 var testModule = (function () { 2     var counter = 0; // 私有变量 3     return { 4         incrementCounter: function () { 5             ///  6             /// 增加计数 7             ///  8             return ++counter; 9         },10         resetConter: function () {11             /// 12             /// 重置计数13             /// 14             counter = 0;15         }16     }17 })();18 19 // 使用20 testModule.incrementCounter();21 testModule.resetConter();

包括命名空间、私有、共有变量的模块:

1 var myNamespace = (function () { 2     // 私有 3     var myPrivateVar = 0; 4     var myPrivateMethod = function (foo) { 5         console.log(foo); 6     }; 7  8     return { 9         // 公有变量10         myPublicVar: 'foo',11 12         //调用私有变量和方法的公有函数13         myPublicFunction: function (bar) {14             myPrivateVar++; // 增加自由的计数器的值15             myPrivateMethod(bar); // 传入bar调用私有方法16         }17     };18 })();
1 var basketModule = (function () { 2     // 私有变量 3     var basket = []; 4  5     function doSomethingPrivate() { 6         // ... 7     } 8  9     function doSomethingElsePrivate() {10         // ...11     }12 13     // 返回一个暴露出的公有对象14     return {15         addItem: function (values) {16             /// 17             /// 添加item到购物车18             /// 19             /// 20             basket.push(values);21         },22         getItemCount: function () {23             /// 24             /// 获取购物车里的item数25             /// 26             return basket.length;27         },28         // 私有函数的公有形式别名29         doSomething: doSomethingPrivate,30         getTotal: function () {31             /// 32             /// 获取购物车里所有item的价格总值33             /// 34             var itemCount = this.getItemCount(),35                 total = 0;36             while (itemCount--) {37                 total += basket[itemCount].price;38             }39             return total;40         }41     };42 43 }());44 45 basketModule.addItem({ item: '面包', price: 5 });46 basketModule.addItem({ item: '黄油', price: 8 });47 console.log(basketModule.getItemCount());48 console.log(basketModule.getTotal());
购物车模块示例

3. 揭示模块模式

1 var myRevealingModule = (function () { 2   3         var privateCounter = 0; 4   5         function privateFunction() { 6             privateCounter++; 7         } 8   9         function publicFunction() {10             publicIncrement();11         }12  13         function publicIncrement() {14             privateFunction();15         }16  17         function publicGetCount(){18           return privateCounter;19         }20  21         // Reveal public pointers to22         // private functions and properties23  24        return {25             start: publicFunction,26             increment: publicIncrement,27             count: publicGetCount28         };29  30     })();31  32 myRevealingModule.start();

 

4. 更多模块模式的代码

 

/* 匿名闭包 */(function () {    var MyAPP = {        version: '0.0.1'    };    MyAPP.print = function () {        console.log(MyAPP.version);    };    MyAPP.print();}());/* 全局导入(Global Import) */(function ($, YAHOO) {    var MyAPP = {        version: '0.0.1'    };    MyAPP.print = function () {        console.log(MyAPP.version);    };    MyAPP.print();    $(function () {        $('body').html(MyAPP.version);    });}(jQuery, YAHOO));/* 模块导出(Module Export) */var MODULE = (function () {    var MyAPP = {},        privateVariable = 1;    function privateMethod() {        ///         /// 私有方法        ///         // ...    }    MyAPP.moduleProperty = 1;    MyAPP.moduleMethod = function () {        // ...    };    return MyAPP;}());/* 高级模块模式 */// Augmentation(augment modules.)var MODULE = (function (my) {    my.anotherMethod = function () {        // added method...    };    return my;}(MODULE));/* 松耦合扩展 */var MODULE = (function (my) {    // 添加方法    return my;}(MODULE || {}));/* 紧耦合扩展 */var MODULE = (function (my) {    var oldModuleMethod = my.moduleMethod;    // 重写模块方法    my.moduleMethod = function () {        // 方法重写,此处可以通过oldModuleMethod访问老方法    };    return my;}(MODULE));/* 克隆和继承 */var MODULE_TWO = (function (old) {    var NewApp = {},        key;    for (key in old) {        if (old.hasOwnProperty(key)) {            NewApp[key] = old[key];        }    }    var super_moduleMethod = old.moduleMethod;    NewApp.moduleMethod = function () {        // override method on the clone, access to super through super_moduleMethod    };    return NewApp;}(MODULE));/* 跨文件私有状态 */var MODULE = (function (my) {    var _private = my._private = my._private || {},        _seal = my._seal = my._seal || function () {            delete my._private;            delete my._seal;            delete my._unseal;        },        _unseal = my._unseal = my._unseal || function () {            my._private = _private;            my._seal = _seal;            my._unseal = _unseal;        };    // permanent(永久) access to _private, _seal, and _unseal    return my;}(MODULE || {}));/* 子模块 */MODULE.sub = (function () {    var my = {};    // ...    return my;}());/* 组合使用 */var UTIL = (function (parent, $) {    var my = parent.ajax = parent.ajax || {};    my.get = function (url, params, callback) {        return $.getJSON(url, params, callback);    };    // etc...    return parent;}(UTIL || {}, jQuery));
模块

参考自:

http://drakeleung.github.io/blog/2016/02/07/JavaScript-Module-A-Beginner-Guide/

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html

转载于:https://www.cnblogs.com/January/p/5227019.html

你可能感兴趣的文章
世界历史教科书-九年级上册.pdf
查看>>
LDAP Authentication for openNebula3.2
查看>>
SRS服务器搭建,ffmpeg 本地推流,srs从本地拉流
查看>>
C++ STL 学习笔记__(6)优先级队列priority_queue基本操作
查看>>
byte_of_python中的备份脚本
查看>>
今日小结 4.16
查看>>
05 配置优化器
查看>>
输入的整数反方向输出
查看>>
[ Nowcoder Contest 167 #C ] 部分和
查看>>
MFC 中CFileDialog的用法
查看>>
关于SVM一篇比较全介绍的博文
查看>>
English - because of,due to ,thanks to ,owing to ,as a result of ,on account of解析
查看>>
全球免费开放的电子图书馆
查看>>
27_Blog Reader
查看>>
个人代码库のC#可移动按钮“相关代码”
查看>>
MyBatis配置项--配置环境(environments)--databaseIdProvider
查看>>
类、对象、方法、实例方法、类方法
查看>>
《CLR via C#》读书笔记 之 目录导航
查看>>
51Nod 1009:1009 数字1的数量 (思维)
查看>>
Spring下载地址
查看>>