Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “是什么意思?”;公共功能可以';如果需要修补程序,则不会被覆盖。”;在Addy';显示模块模式的描述?_Javascript_Revealing Module Pattern - Fatal编程技术网

Javascript “是什么意思?”;公共功能可以';如果需要修补程序,则不会被覆盖。”;在Addy';显示模块模式的描述?

Javascript “是什么意思?”;公共功能可以';如果需要修补程序,则不会被覆盖。”;在Addy';显示模块模式的描述?,javascript,revealing-module-pattern,Javascript,Revealing Module Pattern,这种模式的一个缺点是,如果私有函数引用公共函数,则如果需要修补程序,则不能重写该公共函数。这是因为私有函数将继续引用私有实现,并且该模式不适用于公共成员,只适用于函数 有人能举例说明他的意思吗 将使用对象文字创建的对象与显示模块模式创建的对象进行比较 这里是一个创建为对象文本的 function makeGreeter(name){ return { getName: function(){ return name;}, sayHello: function(){consol

这种模式的一个缺点是,如果私有函数引用公共函数,则如果需要修补程序,则不能重写该公共函数。这是因为私有函数将继续引用私有实现,并且该模式不适用于公共成员,只适用于函数

有人能举例说明他的意思吗


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

这里是一个创建为对象文本的

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
方法将拾取更改。这是因为在对象文字样式中,对公共函数的引用是通过返回的对象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迎宾员不会选择对public
getName
方法的覆盖。这是因为当RMP函数引用其他函数(公共函数和私有函数)时,它们引用的是私有闭包副本,而不是附加到返回对象的公共函数


正是出于这个原因,我认为显示模块模式是一种反模式。

我将
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;
}

郭怡林给出的答案看起来不错,但有一个案例造成了混乱

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()
。造成很多混乱。

这意味着执行类似于
myRevealingModule.increment=newFunction不会更改模块的内部工作方式
myRevealingModule.start
仍将调用内部私有增量函数。这可能是好的,也可能是坏的,这取决于上下文。那么“补丁”在这种情况下,它被称为猴子补丁,或者为什么像这样的补丁是必要的——修复一个bug或者做一些事情只是为了改变对象的行为?但实际上,这样的“补丁”是吗这个例子并没有被认为是非常干净的,这个例子本身似乎没有什么反映我是如何考虑使用“私人”方法的。然而,当我读上面的代码时,没有什么大的惊奇,或者通常的“哦等等……只是JavaScript很奇怪……”或者也许我花了太多的时间和JS在一起,但你上面所说的,正是我所期望的,也许你可以试着用一个更好的例子来解释这一点,好吗?除了创建无法重写的私有方法之外,我不明白这一点是如何证明的。您的示例之所以失败,是因为它对模式的实现很差,而不是因为它是RMP。调整您的示例,使其以所需的方式运行,并且仍然允许您拥有私有方法和常量,从而生成更干净的API,这几乎是微不足道的。区别或优点不仅仅是结尾的返回文字易于操作,这并不能回答这个问题。一旦你有足够的钱,你将能够;相反@ScottBeeson:是的,下次一定会考虑的。
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"