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迎宾员不会选择对publicgetName
方法的覆盖。这是因为当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"