什么是"如果需要补丁,则不能覆盖公共功能".在Addy的Revealing Module Pattern描述中?

gog*_*net 10 javascript revealing-module-pattern

这种模式的缺点是,如果私有函数引用公共函数,则如果需要补丁,则不能覆盖该公共函数.这是因为私有函数将继续引用私有实现,并且该模式不适用于公共成员,仅适用于函数.

有没有人举例说明他的意思?

链接到上面引用的Revealing Module Pattern

I-L*_*Kuo 13

将使用对象文字创建的对象与显示模块模式创建的对象进行比较.

这是一个作为对象文字创建的.

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"
Run Code Online (Sandbox Code Playgroud)

当您getName在返回的对象上覆盖公共方法时sayHello,依赖于该方法的方法将getName获取更改.这是因为在Object Literal样式中,通过this返回的对象引用公共函数.

但是,当您使用Revealing Module Pattern时,

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"
Run Code Online (Sandbox Code Playgroud)

RMP欢迎不会接受对公共getName方法的覆盖.这是因为当RMP函数引用其他函数(公共和私有)时,它们引用私有闭包副本而不是附加到返回对象的公共函数.

因此我将Revealing Module Pattern视为反模式.

  • 但实际上,这样的“补丁”一开始就不是很干净吗? (2认同)
  • 这个例子感觉有点做作,因为它本身似乎并没有反映我如何考虑使用“私有”方法。 (2认同)
  • 然而,当我阅读上面的代码时,并没有什么大的惊喜,或者通常的“哦等等......那只是 javascript 很奇怪......”,或者也许我在 JS 上花费了太多,但是你上面有什么,完全符合我的期望,也许您可​​以尝试用一个更好的例子来解释这一点?除了创建不能被覆盖的私有方法的能力之外,我不明白这个方法如何证明其他任何东西。 (2认同)
  • 你的例子失败了,因为它的模式实现很差,而不是因为它的 RMP。调整您的示例以使其以所需的方式运行几乎是微不足道的,并且仍然允许您拥有私有方法和常量,从而产生更干净的 API。 (2认同)
  • 我的朋友总是有不止一种方法可以给猫剥皮,在这种情况下是 RMP。区别或优势不仅仅是最后的返回文字易于操作。 (2认同)