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.name = ""ha";     console.log(p1.sayName());//ha

这里的Person定义了一个name属性和一个sayName方法 通过生成的对象能调用相应的方法 但是发现生成的对象也能直接调用name属性(这并没有任何奇怪 因为name本身就是生成对象的属性) 这样的模式不能达到我们实现私有属性的目的

要实现私有属性 ,就要通过匿名闭包

(function(){
            //所用的变量和function都在这里声明,作用域也只能存在这个闭包中,这里的代码仍然能访问外部的作用域,是作用链的问题

        }());

我们在匿名闭包中声明变量和function 这样作用域只存在这个闭包中,外界无法访问 ,但是这里的代码可以通过作用链查找到外面的变量

下面我们来实现一个简单的例子(简单的module模式)

var module = (function(){
            var my = {},
                id = 123;

            function getId() {
                return id;
            }//私有变量和function在这里声明,在外边是不能访问到的

            my.Id = id;
            my.getPrivateId = function() {
                return getId();
            }

            return my; //只能通过返回的my来访问内部的私有变量和function
        }());

        console.log(module.Id);
        console.log(module.getPrivateId());   

当我们有新的需求要扩展我们的module的时候(项目组的好几个人都要扩展) 首先他要引入之前的module文件 也就是上面这段例子,然后在进行扩展(这样也实现了module的多人开发)

var module = (function(my){
            my.say = function() {
                return "扩展了";
            }

            return my;
        }(module));

        console.log(module.say()); //扩展了

这里实现的方式是将之前的module传入匿名闭包函数 ,对它的相应的功能进行添加,同时还是保持了之前私有变量和function的私有性,这里的var并不是必须的(因为之前已经声明了module 这是一种紧耦合的扩展模式),这种模式对文件的加载顺序有要求

如果不对文件的加载顺序有要求,也就是松耦合的扩展模式 可以这样实现

var module = (function(my){
            //扩展

            return my;
        }(module || {}))

当我们为匿名闭包传递参数的时候传递的是 module || {} 也就是当module不存在的时候 ,我们去创建它 这就不需要我们文件的加载顺序有要求了,这是一种松耦合的扩展模式,这种模式下也有一定的限制,就是不能重写一些属性和方法 (因为不用加载顺序,当我们想重写的时候,相应的属性和方法有可能不存在,就不存的重写这个说法,也就是新的定义)并且这里的var必须写,(因为其他的人想读取你的文件的时候会读取不到)

紧耦合的模式下虽然限制了加载的顺序,但是能提供给我们重写属性方法的机会

var module = (function(){
            var my = {};
            var id = 123;
            function a() {
                return "a";
            };

            my.b = function(){
                return "this is old func";
            }
            return my;
        }());
        console.log(module.b());//this is old func
        var module = (function(my){
            var oldfunc = my.b;

            my.b = function() {
                return "this is new func";
            }
            my.oldfunc = oldfunc;
            return my;
        }(module));

        console.log(module.b()); //this is new func
        console.log(module.oldfunc());//this is old func

上面是一个完成了例子 重写了之前定义的b方法 并且通过将之前的方法重新添加到module中,也可以访问之前的方法

子模块实现方式 当我们需求在上面的module下实现一个子模块的时候 我们可以这样

module.test = (function(){
            var name = "aa",
                my = {};

            my.sayName = function(){         //console.log(mudule.b()); //子模块能调用父模块的方法 他们在一个命名空间
                return name;
            }

            return my;
        }());

        console.log(module.test.sayName());//aa

这样就实现了一个子模块

在javascript设计模式的书中,提供了一种创建命名空间的方式,上面的创建子模块的方式 子模块和父模块存在一个命名空间(有些时候我们想要实现的是两个module存在不同的命名空间 ) 下面给出书中的实现方式

首先我们需要一个创建命名空间的通用函数

    var MySpace = MySpace || {};
        MySpace.namespace = function(ns_string){
            var parts = ns_string.split(‘.‘),
                parent = MySpace,
                i = 0,
                length = 0;

            if(parts[0] === "MySpace") {
                parts = parts.slice(1);
            }

            for(i = 0;length = parts.length,i < length;i += 1) {
                if(typeof parent[parts[i]] === "undefined") {
                    parent[parts[i]] = {};
                }

                parent = parent[parts[i]];
            }

            return parent;

        }

通过上面的函数我们就能在相应的命名空间里创建我们的module了

MySpace.namespace(‘MySpace.modules.test‘);

        MySpace.modules.test = (function(){
            var name = "haha",
                my = {};

            my.sayName = function(){
                return  name;
            }

            return my;
        }());
MySpace.namespace(‘MySpace.modules.a‘);//在同样的层级创建其他的module
 

参考 javascript设计模式

blog http://www.cnblogs.com/TomXu/archive/2011/12/30/2288372.html

时间: 2024-07-30 03:11:57

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年前提出了这个概念,我们将从一个简单的例子来解释一下基本的用法(如果你已经非常熟悉了,请忽略这一节

&lt;深入理解JavaScript&gt;学习笔记(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,不学,连初学者

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

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

Module 模式 以及 揭示模式。

---恢复内容开始--- Module模式 : 在传统软件工程中为类提供私有和公有封装的方法. 在js中: Module 模式 使用闭包封装 私有状态和组织. 该模式,返回一个公有的API,而其他的一切都维持在私有闭包中. 由于js没有访问修饰符,我们不能称变量是公有或私有的,因此需要使用函数作用域来模拟这个概念. 使用Module 模式的优点 : 1)只有我们的模块才能享有拥有私有函数的自由. 2)函数异常的发现变的更加容易. 3)更加整洁. 4)支持私有数据. 缺点: 1)改变成员可见性 ,

Centos6部署lamp: httpd2.2+module模式

系统: Centos6 httpd版本: 2.2 使用prefork工作模式 安装方法: 使用源码包安装mariadb 使用yum安装php 注: 如果使用mariadb官方的yum源安装,速度很慢 一.安装mariadb:   1.    准备源码包   2.    准备mysql组和用户 groupadd -r -g 306 mysql useradd -r -g mysql -u 306 mysql   3.    部署mariadb tar-xzvf mariadb-5.5.46-lin

Centos6部署lamp: httpd2.4+module模式

系统: Centos6 httpd版本: 2.4 使用event工作模式 php版本: 5.4.26 mariadb版本: 5.5.46 xcache版本: 3.0.3 安装顺序: php最后安装 一.准备源码包: 二.安装httpd: 1.安装所需环境 yum groupinstall -y"Development tools" "Server Platform Development" yum install -y pcre-devel     2.    安装

Centos7部署lamp: httpd2.4(event)+module模式

系统: Centos7 httpd版本: 2.4 使用event工作模式 安装方法: 使用yum安装httpd和mariadb 编译安装php,启用多线程支持 一.安装httpd和mariadb: yum install -y httpd httpd-devel php-mysql mariadb-server systemctl start mariadb      //启动mariadb systemctl start httpd         //启动httpd     二.安装PHP: