Module模式 - 深入了解Javascript
2015-07-10 14:14
609 查看
/* Modelu模式 优点:效率高,代码少,加载速度快,松耦合允许并行加载,提升下载速度 缺点:初始化时间久一点 */ //一、基础用法 var calculate = function (eq) { //私有成员 var eqCtl = document.getElementById(eq); return { //暴露公开成员 add: function (x, y) { var val = x + y; eqCtl.innerHTML = val; } } } //使用方式 //缺点:每次调用都要new,copy多份 var calculator = new calculate(); calculator.add(2, 2); //二、匿名闭包 ?闭包用途和场景 (function () { //--所有变量和fucntion都在此声明,并且作用域也只在这个匿名闭包 //--依然可以访问外部全局对象 }()); //()匿名函数自己执行,不用new //三、引用全局变量 /* 隐式全局变量:无论一个变量是否使用,js会反向遍历作用域链来找到var,如果没找到var,则假定该变量为全局 */ (function ($, yahoo) { //这里使用了全局的jQuery和yahoo }(jQuery, yahoo)); //声明全局变量,module模式 var blogModule = (function () { var my = {}, privateName = '博客园'; function privateAddToTopic(data) { //内部处理代码 } my.Name = privateName; my.AddTopic = function (data) { privateAddToTopic(data); }; return my; }()); //三、高级用法 易于扩展结构 //扩展添加一个函数 var blogModule = (function (my) { my.AddTopic = function () { } return my; }(blogModule)); //--缺点:必须先声明blogModule //松耦合扩展,加载顺序不固定,缺点:不一定能用所有属性和函数 var blogModule = (function (my) { return my; }(blogModule || {})); //紧耦合扩展 //重载 var blogModule = (function (my) { var oldAdd = my.AddTopic; my.AddTopic = function () { //重载,依然可以用oldAdd调用旧的方法 } return my; }(blogModule)); //克隆和继承 var blogModule = (function (old) { var my = {}, key; for (key in old) { if (old.hasOwnProperty(key)) { my[key] = old[key]; } } var oldAdd = old.AddTopic; my.AddTopic = function () { } return my; }(blogModule)); //--非继承,只是同个对象多个引用 //跨文件共享私有对象 var blogModule = (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; } return my; }(blogModule || {})); //子模块 blogModule.CommentSubModule = (function () { var my = {}; return my; }()); /* 创建一个立即执行的匿名函数表达式 return一个变量,其中这个变量包含你要暴露的属性 返回这个变量将赋值给counter,而不是外部声明的function自身 */ var counter = (function () { var i = 0; return { get: function () { return i; }, set: function (val) { i = val; }, increment: function () { return ++i; } }; }()); //counter是一个待有过个属性的对象 counter.get(); counter.set(3); counter.increment(); counter.increment(); counter.i;//undefined i;//引用错误
相关文章推荐
- javascript在不同浏览器设置窗口高度、宽度,改变窗口大小
- 关于jsp页面 title中文乱码问题的解决方法
- extjs 根据查询条件导出内容
- js实现简单的拖曳
- setTimeout&&setInterval
- js 字符串中某字符被全部替换
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
- JS获取本周周一 周日日期、本季度、本月、上月的开端日期、停止日期
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
- JS处理图片宽高
- JSP公用分页模块+数字分页
- javascript实现rgb颜色转换成16进制格式
- 转JavaScript的语法解析与抽象语法树
- 再谈JavaScript线程
- js 异常处理
- javascript实现判断鼠标的状态
- 记录一种Json转Model的思路
- javascript检查浏览器是否已经启用XX功能