在Addy对“揭示模块模式”的描述中,“如果需要补丁,公共职能不能被忽略”。

这种模式的一个缺点是,如果一个私有函数引用一个公共函数,那么如果补丁是必要的,则该公共函数不能被覆盖。 这是因为私有函数将继续引用私有实现,而模式不适用于公共成员,而只适用于函数。

有没有人有他的这个意思的例子?

链接到上面引用的“揭示模块模式”

将使用对象文字创build的对象与“显示模块模式”创build的对象进行比较。

这是创build为一个对象字面值。

 function makeGreeter(name){ return { getName: function(){ return name;}, sayHello: function(){console.log("Hello, " + this.getName());} } } var greeter = makeGreeter("Danny"); greeter.sayHello; // "Hello, Danny" greeter.getName = function(){ return "George";} greeter.sayHello(); // "Hello, George" 

当你重写返回对象上的公共方法getName时,依赖于getNamesayHello方法将获取更改。 这是因为在Object Literal样式中,通过this返回的对象来引用公共函数。

但是,当您使用“揭示模块模式”时,

 function makeGreeter(name){ var getName = function(){ return name;}, sayHello = function(){console.log("Hello, " + getName());}; return { getName: getName, sayHello: sayHello } } var greeter = makeGreeter("Danny"); greeter.sayHello; // "Hello, Danny" greeter.getName = function(){ return "George";} greeter.sayHello(); // "Hello, Danny" 

RMP迎宾者不会select公共的getName方法。 这是因为当RMP函数引用其他函数(public和private)时,它们引用私有闭包副本而不是附加到返回对象的公共函数。

正因为如此,我把“揭示模块模式”看作反模式。

我将绑定getName ,看起来,它指向RMP中返回的内容。

 function makeGreeter(name){ this.getName = function(){ return name;}; var _sayHello = function(){console.log("Hello, " + this.getName());}; return { getName: getName, sayHello: _sayHello } } 

不过,我更喜欢这个:

 function makeGreeter(name){ this.getName = function(){ return name;}; var _sayHello = function(){console.log("Hello, " + this.getName());}; var API = { getName: getName, sayHello: _sayHello }; return API; }