繁体   English   中英

如何在 JavaScript 中使用揭示模块模式

[英]How to use Revealing module pattern in JavaScript

我偶然发现了这篇文章: JavaScript 的揭示模块模式 我想在我的项目中使用它。

假设我有一个函数abc并且我在我的主 JavaScript 文件中调用该函数。

这种模式会让事情变得不同吗? 任何人都可以向我展示这种模式的基本示例吗?

一个小例子:

var revealed = function(){
   var a = [1,2,3];
   function abc(){
     return (a[0]*a[1])+a[2];
   }

   return {
      name: 'revealed',
      abcfn: abc
   }
}();

在开始给匿名函数revealed值, aabc是私有的该功能。 该函数返回的是一个带有name属性和abcfn属性的对象字面abcfn ,它是对abc function的引用。 abc function使用私有变量a 这一切都可以通过使用闭包来完成(函数范围内的所有内容都可以被同一函数中的其他所有内容引用)。

显示用途:

alert(revealed.name);    //=> 'revealed'
alert(revealed.abcfn()); //=> 5 (1*2+3)

DC = 道格拉斯·克罗克福德
RMP = 揭示模块模式

DC 和 RMP 之间的区别主要是组织性/可读性

文章本身中提供了示例? 你到底在问什么,因为这些东西与文件无关,而是与闭包有关。

您将所有内容都放在一个闭包(函数)中,并仅公开您希望访问的那些部分。 DC的风格和RMP之间的区别是,在第一个功能在不同的地方被定义而在RMP,他们在同一个地方总是定义,然后在公共对象字面事后透露

所以在 DC 和 RMP 中你有:

  • 可以定义私有部分(变量和函数)的闭包
  • 私处
  • 公共结果,定义公开可见的功能和变量(状态)

这两种模式仅在可读性上有所不同。 在 DC 情况下,您无法始终知道将在何处定义某些功能,但在 RMP 中,您始终知道一切都在私有部分。

揭示模块模式在Essential JavaScript Design Patterns For Beginners文章中描述得非常好。

作者所称的“Douglas Crockford's pattern for created objects”实际上是Richard Cornford等人开发的模块模式。 请参阅http://groups.google.com/group/comp.lang.javascript/msg/9f58bd11bd67d937

至于例子,有很多。 阅读以下文章并点击一些链接: http : //peter.michaux.ca/articles/module-pattern-provides-no-privacy-at-least-not-in-javascript-tm

我喜欢将揭示模块模式单例模式混合使用,以便我可以保持结构化代码与模块模式的好处:

var MyFunction = function(){

    var _ = {
       Init: function(){
          _.Config.foo = "hello world";
       },
       Config:{
          foo:null
       },
       ShowAlert:function(){
          alert(_.Config.foo);
       }
    }

    return {
        Init: _.Init,
        ShowAlert: _.ShowAlert
    };
}();

MyFunction.Init();
MyFunction.ShowAlert();

我在我的博客上写了更多关于这个的信息:

http://curtistimson.co.uk/js/mixing-revealing-module-and-singleton-javascript-patterns/

只想补充一点:使用这种模式,最好将全局依赖项作为参数/参数传递,以便它们是显式的。 您不必这样做,但这使您的模块从第一眼就很清楚需要什么。 例如:

var myModule = (function ($, loadModule) {
  "use strict";
})(jQuery, load);

在此示例中,您可以立即在第一行看到您的模块使用 jQuery 和其他一些负责加载功能的模块。

https://www.realmelon.com/revealing-module-design-pattern-in-javaScript/

我写了一篇关于它的文章。

你可以看看这个

显示模块的基本概念是您有一个封装其数据和行为的Object

var Module = (function(){
    var privateStuff = {};
    var publicStuff = {};

    return publicStuff;
})();

但是,在使用此模式时,您应该采用一些最佳实践。 为了演示,这是一个具有一些属性的模块(“ Modulus ”),它采用了以下一些实践:

function AbstractSomeClass(id) {
    this.id = id;
    return this;
}

var Modulus = (new (function SomeClass() {
    var thus = this;

    function NameClass(name){
        this.value = thus.name || name;
    }

    AbstractSomeClass.call(this, 998);

    this.name = 'Touring';
    this.name = ( new NameClass('Hofstadter') ).value;

    return {
        id: this.id,
        name: this.name
    };
})());

注意(new (function SomeClass(){ ... })()); 句法。 使用new这样可以让你使用this封闭的内部关键字。 如果您需要从另一个类继承属性( AbstractSomeClass.call(this, 998);AbstractSomeClass.call(this, 998);这很方便——但是,您仍然需要显示您想要公开的属性,例如:

return {
    id: this.id,
    name: this.name
};

另请注意,我们分配thisthus -这使我们能够使用的父- this是有它自己的一个子类里面this范围( this.value = thus.name || name;

同样,这些只是建议的一些约定和最佳实践。

这是揭示模块模式的小例子。

它提供了一个工具来声明私有和公共函数,就像一个类。这是这种模式的主要好处。如果我们不想公开一些可以从全局访问的功能,那么将其设为私有,其余的设为公有。下面是如何创建私有和公共函数的例子。还有一件事是一个可自我执行的代码块。

  var Calculator = (function () {

        var num1 = 10;
        var num2=5
        var _abc = function () {
            return num1 - num2;
        };

        var _mulFunc = function () {
            return num1 * num2;
        };

        var _divFunc = function () {
            return num1/num2;
        };

        return {
           //public scope
            abc: _abc,
            mulFunc:_mulFunc
         };

    })();

警报(计算器.abc()); 它返回 5

警报(计算器。mulFunc()); 它返回 50

并且 __divFunc() 将无法访问,因为它在私有范围内。 我们只能访问那些在return 对象中声明的函数,因为它是公共函数表示

对模块外的代码来说,差别不大。 在该文章的所有 3 个案例中,方法的调用方式相同。 但是模块本身的结构在内部是不同的。

Crockford 的模块模式和他们所谓的“揭示模块模式”在结构上几乎是一样的。 唯一的区别是他们首先将方法分配给本地 var 以便更具可读性。 但实际上并没有什么特别之处,您的链接中有一些示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM