“如果需要补丁,则公共功能不能被覆盖”是什么意思。在 Addy 对揭示module模式的描述中?

IT技术 javascript revealing-module-pattern
2021-03-09 19:28:29

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

有没有人有一个例子来说明他的意思?

链接到上面引用的揭示module模式

3个回答

将使用对象字面量创建的对象与显示module模式创建的对象进行比较。

这是一个作为对象字面量创建的。

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返回对象上的公共方法sayHello,依赖方法会getName进行更改。这是因为在 Object Literal 样式中,对公共函数的引用是通过this返回的对象进行的。

然而,当你使用揭示module模式时,

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 欢迎程序不会选择对公共getName方法的覆盖这是因为当 RMP 函数引用其他函数(公共和私有)时,它们引用的是私有闭包副本,而不是附加到返回对象的公共函数。

正是出于这个原因,我将揭示module模式视为一种反模式。

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

我会绑定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;
}

@I-Lin Kuo 给出的答案看起来不错,但在一个案例中造成了混乱。

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"

而不是greeter.sayHello它应该是greeter.sayHello()造成很多混乱。

这并没有提供问题的答案。一旦您拥有足够的声誉,您就可以对任何帖子发表评论相反,提供不需要提问者澄清的答案-来自评论
2021-04-17 19:28:29
@ScottBeeson 是的,下次肯定会考虑这个。
2021-05-01 19:28:29