我偶然发现了这篇文章:JavaScript 的揭示module模式。我想在我的项目中使用它。
假设我有一个函数abc
,我在我的主 JavaScript 文件中调用该函数。
这种模式会让事情变得不同吗?任何人都可以向我展示这种模式的基本示例吗?
我偶然发现了这篇文章:JavaScript 的揭示module模式。我想在我的项目中使用它。
假设我有一个函数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
一个值,a
并且abc
对该函数是私有的。该函数返回的是一个带有name
属性和abcfn
属性的对象字面量,它是对abc function
. 在abc function
使用私有变量a
。这一切都可以通过使用闭包来完成(函数范围内的所有内容都可以被同一函数中的其他所有内容引用)。
显示用法:
alert(revealed.name); //=> 'revealed'
alert(revealed.abcfn()); //=> 5 (1*2+3)
DC = Douglas Crockford
RMP = 揭示module模式
示例是在文章本身中提出的吗?你到底在问什么,因为这些东西与文件无关,而是与闭包有关。
你把所有东西都放在一个闭包(函数)中,只暴露那些你希望可以访问的部分。DC的风格和RMP之间的区别是,在第一个功能在不同的地方被定义而在RMP,他们在同一个地方总是定义,然后再把显露在公众对象文本。
所以在 DC 和 RMP 中你有:
这两种模式仅在可读性上有所不同。在 DC 情况下,您不能总是知道某些功能将在哪里定义,但在 RMP 中,您总是知道一切都在私有部分。
揭示module模式在Essential JavaScript Design Patterns For Beginners文章中描述得非常好。
作者所称的“Douglas Crockford 的对象创建模式”其实就是Richard Cornford等人开发的module模式。请参阅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
我喜欢将揭示module模式与单例模式混合使用,以便我可以保留具有module模式优点的结构化代码:
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/