《JavaScript设计模式》——9.3 Revealing Module(揭示模块)模式

9.3 Revealing Module(揭示模块)模式

现在对Module模式应该更加熟悉了,让我们来看一个稍有改进的版本—Christian Heilmann的Revealing Module模式。

Revealing Module模式的产生是因为Heilmann很不满意这种状况:当他想从另一个方法调用一个公有方法或访问公有变量时,必须要重复主对象的名称。他也不喜欢使用Module模式时,必须要切换到对象字面量表示法来让某种方法变成公有方法。

他努力的结果就是创建了一个更新的模式,能够在私有范围内简单定义所有的函数和变量,并返回一个匿名对象,它拥有指向私有函数的指针,该函数是他希望展示为公有的方法。

有关如何使用Revealing Module模式的示例如下所示:

var myRevealingModule = function () {
   var privateVar = "Ben Cherry",
     publicVar = "Hey there!";
function privateFunction() {
        console.log("Name:" + privateVar);
    }
function publicSetName(strName) {
        privateName = strName;
    }
    function publicGetName() {
        privateFunction();
    }
// 将暴露的公有指针指向到私有函数和属性上
return {
        setName: publicSetName,
        greeting: publicVar,
        getName: publicGetName
    };
}();
myRevealingModule.setName("Paul Kinlan");

如果你喜欢,该模式也可以用于展示拥有更具体命名方案的私有函数和属性:

var myRevealingModule = function () {
var privateCounter = 0;
function privateFunction() {
        privateCounter++;
    }
    function publicFunction() {
        publicIncrement();
    }
    function publicIncrement() {
        privateFunction();
    }
    function publicGetCount() {
        return privateCounter;
    }
    // 将暴露的公有指针指向到私有函数和属性上
    return {
        start: publicFunction,
        increment: publicIncrement,
        count: publicGetCount
    };
}();
myRevealingModule.start();

9.3.1 优点
该模式可以使脚本语法更加一致。在模块代码底部,它也会很容易指出哪些函数和变量可以被公开访问,从而改善可读性。

9.3.2 缺点
该模式的一个缺点是:如果一个私有函数引用一个公有函数,在需要打补丁时,公有函数是不能被覆盖的。这是因为私有函数将继续引用私有实现,该模式并不适用于公有成员,只适用于函数。

引用私有变量的公有对象成员也遵守无补丁规则。

正因为如此,采用Revealing Module模式创建的模块可能比那些采用原始Module模式创建的模块更加脆弱,所以在使用时应该特别小心。

时间: 2025-01-19 03:12:19

《JavaScript设计模式》——9.3 Revealing Module(揭示模块)模式的相关文章

《JavaScript设计模式》——9.2 Module(模块)模式

9.2 Module(模块)模式 模块是任何强大应用程序架构中不可或缺的一部分,它通常能够帮助我们清晰地分离和组织项目中的代码单元. 在JavaScript中,有几种用于实现模块的方法,包括: 对象字面量表示法 Module模式 AMD模块 CommonJS模块 ECMAScript Harmony模块 我们稍后将在本书第11章探索后三种方法.Module模式在某种程度上是基于对象字面量,因此首先重新认识对象字面量是有意义的. 9.2.1 对象字面量 在对象字面量表示法中,一个对象被描述为一组包

《JavaScript设计模式》——第9章 JavaScript设计模式9.1 Constructor(构造器)模式

第9章 JavaScript设计模式 在本章中,我们将探索一些经典与现代设计模式的JavaScript实现. 开发人员通常想知道他们是否应该在工作中使用一种"理想"的模式或模式集.这个问题没有明确的唯一答案,我们研究的每个脚本和 Web 应用程序可能都有它自己的个性化需求,我们需要思考模式的哪些方面能够为实现提供实际价值. 例如,一些项目可能会受益于观察者模式提供的解耦好处(这可以减少应用程序的某些部分对彼此的依赖度),而有些项目可能只是因为太小,而根本无需考虑解耦. 也就是说,一旦我

《JavaScript设计模式》——第11章 牛郎织女——代理模式 11.1无法获取图片上传模块数据

第11章 牛郎织女--代理模式 代理模式(Proxy):由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介的作用. 由于用户相册模块上传的照片量越来越大,导致服务器端需要将图片上传模块重新部署到另外一个域(可理解为另一台服务器)中,这样对于前端来说,用户上传图片的请求路径发生变化,指向其他服务器,这就导致跨域问题. 11.1 无法获取图片上传模块数据 "小铭,你帮我看看,为什么我向咱们图片上传模块所在的服务器发送的请求,得不到数据呢?"小白问小铭. //

Javascript设计模式理论与实战:简单工厂模式

通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式的理论,并且举例说明了简单工厂模式的具体应用. 基本介绍 简单工厂模式是工厂模式中最基本的一种.通过定义一个工厂类,根据参数实例化具体的某个产品类. 举例说明 我们举个例子进行说明:假设我们开发一个旅游行业网站,网站上面销售机票,酒店等产品.一个用户准备购买一张机票.我们可以定义相关类如下: var

JavaScript设计模式之观察者模式(发布者-订阅者模式)_javascript技巧

观察者模式( 又叫发布者-订阅者模式 )应该是最常用的模式之一. 在很多语言里都得到大量应用. 包括我们平时接触的dom事件. 也是js和dom之间实现的一种观察者模式. 复制代码 代码如下: div.onclick  =  function click (){ alert ( "click' ) } 只要订阅了div的click事件. 当点击div的时候, function click就会被触发. 那么到底什么是观察者模式呢. 先看看生活中的观察者模式. 好莱坞有句名言. "不要给我

《JavaScript设计模式》——导读

前言 JavaScript设计模式 设计模式是解决软件设计中常见问题的可复用方案.探索任何编程语言时,设计模式都是一个令人兴奋和极具吸引力的话题. 原因之一是:设计模式是许多先前开发人员总结出的经验,我们可以借鉴这些经验进行编程,以确保能够以优化的方式组织代码,为我们解决棘手的问题提供参考. 设计模式还是我们用来描述解决方案的常用词汇.当我们想要向其他人表述一种以代码形式构建解决方案的方式时,描述设计模式比描述语法和语义要简单得多. 在本书中,我们将探讨JavaScript编程语言中经典的与现代

javascript设计模式之module(模块)模式_javascript技巧

模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元. js中实现模块的方法: 1.对象字面量表示法  2.Module模式  3.AMD模块  4.CommonJS模块  5.ECMAScript Harmony 模块 对象字面量 对象字面量不需要使用new运算符进行实例化,但不能用在一个语句的开头,因为开始的可能被解读为一个块的开始,在对象的外部,新成员可以使用如下赋值语句添加到对象字面量上,myModule.property = "someValue&

JavaScript 匿名函数、模块模式、闭包、命名空间、创建构造器(类)、继承

今天无论是在浏览器中还是在浏览器外,JavaScript世界正在经历翻天覆地地变化.如果我们谈论脚本加载.客户端的MVC框架.压缩器.AMD.Common.js还有Coffeescript--只会让你的脑子发昏.对于那些已经早就熟知这些技术的人而言,或许很难想象到现在为止还有很多JS开发者还不熟悉这些工具,甚至事实上,他们很可能现在还不想去尝试这些工具.这篇文章将会介绍一些很基础的JS知识,以及当开发者想要尝试Backbone.js和Ember.js之类的工具之前需要知道一些内容.当你理解了这篇

常用的Javascript设计模式

<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰