在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
时,依赖于getName
的sayHello
方法将获取更改。 这是因为在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; }