JavaScript--Module模式

//module: Module模式是JavaScript编程中一个非常通用的模式window.onload = function() {    //1、基本使用:    var MyFn = function() {        var age = 24,sex = "boy";//私有变量        var action = function() {//私有行为            console.log("it man");        };        return {//暴露的公开成员            work : "orderMonkey",            action2 : function() {                console.log("it developer!");            }        }    };    var newMyFn = new MyFn();    console.log(newMyFn.action2());    console.log("===============================");    //基本用法的缺点:每次使用时都要使用new 关键字生成,这样在内存中每次会copy一份,占用内存,使用闭包可以避免内存问题,实现自执行。也可以实现功能的扩展。

//2、模块方法:    var MyFn2 = (function() {        var my = {};//向外返回的对象        var age = 25,name = "assassin";        var action = function() {            console.log("内部私有成员");        };        my.EnglishName = "wanghf";        my.action2 = function() {            console.log("major in JavaScript!");        };//公有代码状态        return my;        /*return my = {//向外返回的对象         work : "It developer",         action2 : function() {         console.log("外部成员变量");         }         }*/    })();    console.log(MyFn2.action2());//调用时避免生成,减小内存占有量    console.log("===============================");    //模块方法全局变量的引入和jQuery设计思路一样采用全局传参    var MyFn3 = (function($) {        //同上    })(jQuery);    //3、模块的扩展:    //对于大型项目测需要对自己的扩展了,基于上述的思想,同样把自己作为参数传值,进行扩展    var MyFn2 = (function(my) {//var不是必写,为了统一。        my.addName = "intelwisd";        my.addAction3 = function() {            console.log("扩展的新方法...");        };        /*var my1 = {         addName : "intelwisd",         addAction3 : function() {         console.log("外部成员变量");         }         };*/ //对象的形式有对象的拷贝之前的会覆盖以前的        return my;    })(MyFn2);    console.log(MyFn2.action2());    console.log("===============================");    //4、松耦合扩展和紧耦合扩展    //松耦合扩展 利用 var MyFn2 = MyFn2 || {};    var MyFn2 = (function(my) {        my.addName1 = "intelwisd1";        my.addAction4 = function() {            console.log("松耦合扩展的新方法...");        };        /*var my = {         addName: "intelwisd111",         addAction3: function () {         console.log("外部成员变量");         }         };*/        return my;    })(MyFn2 || {});    console.log(MyFn2.EnglishName);    console.log(MyFn2.addName1);    console.log(MyFn2.action2());    console.log(MyFn2.addAction4());    //松耦合的优点:确保该对象,在存在的时候直接用,不存在的时候直接赋值为{}    console.log("===============================");    //紧耦合扩展 可以实现重载的功能,但要确保加载顺序    var MyFn2 = (function(my) {        var addAction4 = my.newAddAction4;        my.newAddAction4 = function() {//重载函数,以前的函数可以继续使用            console.log("紧耦合扩展....");        };        return my;    })(MyFn2);    console.log(MyFn2.addAction4());    console.log(MyFn2.newAddAction4());    console.log("===============================");    //5、克隆与继承 (在紧耦合的基础上进行继承,其实该对象的属性对象或function根本没有被复制,只是对同一个对象多了一种引用而已,所以如果老对象去改变它,那克隆以后的对象所拥有的属性或function函数也会被改变。)    var MyFn2 = (function(my) {        var my1 = {}, key;        for (key in my) {            if (my.hasOwnProperty(key)) {                my1[key] = my[key];            }        }        var addAction4 = my1.newAddAction4;        my1.newAddAction4 = function() {//重载函数,以前的函数可以继续使用            console.log("紧耦合扩展2....");            // 克隆以后,进行了重写,当然也可以继续调用以前的        };        return my1;    })(MyFn2);    console.log(MyFn2.addAction4());    console.log(MyFn2.newAddAction4());    console.log("===============================");    //6、跨文件中的私有成员的共享    var MyFn3 = (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;    } (MyFn2 || {}));    //任何文件都可以对他们的局部变量_private设属性,并且设置对其他的文件也立即生效。一旦这个模块加载结束,应用会调用 blogModule._seal()"上锁",这会阻止外部接入内部的_private。如果这个模块需要再次增生,应用的生命周期内,任何文件都可以调用_unseal() ”开锁”,然后再加载新文件。加载后再次调用 _seal()”上锁”。    //子模块共有的成员创建    MyFn2.CommentSubModule = (function () {        var my = {};        // ...

return my;    } ());    //eg:    MyFn3.CommentSubModule = (function () {        var my = {            name : "assassin",            Fn1 : function() {                alert(0);            }        };        // ...

return my;    } ());}

学习来源Tom大叔javascript--Module
时间: 2024-10-12 22:22:45

JavaScript--Module模式的相关文章

Javascript Module 模式

Javascript Module Pattern 可以说是在Javascript代码实现过程中的最佳实践方法,能够清晰地表达Javascript面向对象的概念.其核心理念是用Javascript的“类”封装私有和公有的属性和方法.它不允许开发人员定义全局变量去“污染”全局对象.通过这种模式,可以提高Web的性能,也利于维护Javascript的代码. 在Javascript程序设计语言中,函数可以作为一个模块,在某些情况下,需要创建的是单例对象,而不是创建一个类的实例.在模块的内部,公共接口可

深入理解JavaScript系列(3):全面解析Module模式

简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可重用 封装了变量和function,和全局的namaspace不接触,松耦合 只暴露可用public的方法,其它私有方法全部隐藏 关于Module模式,最早是由YUI的成员Eric Miraglia在4年前提出了这个概念,我们将从一个简单的例子来解释一下基本的用法(如果你已经非常熟悉了,请忽略这一节

<深入理解JavaScript>学习笔记(3)_全面解析Module模式

简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可重用 封装了变量和function,和全局的namaspace不接触,松耦合 只暴露可用public的方法,其它私有方法全部隐藏 基本用法 先看一下最简单的一个实现,代码如下: var Calculator = function (eq) { //这里可以声明私有成员 var eqCtl = doc

【JavaScript】设计模式-module模式及其改进

写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个模式" 2.中级人员模式: "或许这里我需要一个单件模式" 3.悟道者心智:"在这里使用一个装饰者模式相当自然" but,but,but,不学,连初学者

转载翻译文章:JavaScript Module Pattern: In-Dept

# JavaScript Module Pattern: In-Depth # 转载翻译文章:JavaScript Module Pattern: In-Depth*原文*:http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html 模块模式是一种常见的js开发编码模式.通常来说,它很好理解,但还有一些高级应用并没有得到太多关注.这篇文章,我将回顾基础知识,并介绍一些真正了不起的高级主题,其中包括一个我认为极为原始的

Javascript编程模式(JavaScript Programming Patterns)Part 1.

JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript libraries变得越来越流行. 如果你面对着很多的工作计划,一个很明确的道理就是在网站变得越来越复杂的情况下每次修改‘轮子“肯定让你不爽.当然我们把类库放到一边,聚焦于 JavaScript的语法,对你最有价值的东西是在你编写 JavaScript你要明确你使用的是那种”编程模式“. 下面主要介绍几个jav

module模式小记

当我们以一个通常的写法来写一个构造函数的时候(通过new 调用的函数) 它里面的属性和方法对外界是可见的 function Person() { this.name = "haha"; this.sayName = function(){ return this.name; } return this; } var p1 = new Person(); console.log(p1.sayName());//haha console.log(p1.name);//haha p1.nam

(转)深入理解JavaScript 模块模式

深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth 模块模式是JavaScript一种常用的编码模式.这是一般的理解,但也有一些高级应用没有得到很多关注.在本文中,我将回顾基础知识,浏览一些不错的高级技巧,甚至我认为是原生基础的

【设计模式】module模式&amp;&amp;Revealing module (揭示)模式

写在前面 <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个模式" 2.中级人员模式: "或许这里我需要一个单件模式" 3.悟道者心智:"在这里使用一个装饰者模式相当自然" but,but,but,不学,连初学者都不算呐... 先了解一下设计模式的起源吧: >>>设计模式的起源就比较有意思了,设计模式最初起源于奥地利维也纳的

Javascript 严格模式详解

Javascript 严格模式详解 作者: 阮一峰 日期: 2013年1月14日 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度