用Google搜索但找不到合适的资源来解释使用显示模块模式和this
关键字之间的区别。
使用揭示模块模式时,我可以使用以下代码:
var moduleRevealing = function() {
var talk = function() {
console.log("Talking....");
};
var walk = function() {
console.log("Walking...");
};
return {
talk: talk,
walk: walk
}
};
console.log('Module Pattern Object');
console.log(moduleRevealing());
现在使用this
关键字可以实现同样的目的:
var module = function() {
var talk = function() {
console.log("Talking....");
};
this.walk = function() {
console.log("Walking...");
};
this.talk = talk;
};
var mod1 = new module();
console.log('Module Object');
console.log(mod1);
两者有何不同?我只能看到一个区别,那就是__proto
;前者指向Object
,而后者指向module
。
如果有人想要查看代码 - Fiddle
答案 0 :(得分:3)
在你的简单例子中没有任何区别,但让我让它变得更复杂。
var moduleRevealing = function() {
var talk = function() {
console.log("Talking....");
};
var walk = function() {
console.log("Walking...");
};
var walkAndTalk = function(){
walk();
talk();
};
return {
talk: talk,
walk: walk,
walkAndTalk: walkAndTalk
}
};
使用this
,
var module = function() {
var talk = function() {
console.log("Talking....");
};
this.walk = function() {
console.log("Walking...");
};
this.talk = talk;
this.walkAndTalk = function(){
this.walk();
this.talk();
}
};
当您覆盖其方法时,这两个稍微复杂的示例现在具有非常不同的行为。
var modR = moduleRevealing();
var mod1 = new module();
modR.walk = function() {console.log('FAST Walking...");}
mod1.walk = function() {console.log('FAST Walking...");}
modR.walk(); // outputs "FAST Walking..."
modl.walk(); // outputs "FAST Walking..."
modR.walkAndTalk(); // outputs "Walking ... Talking..."
mod1.walkAndTalk(); // outputs "FAST Walking...Talking..."
请注意,即使更改了walk()
的输出当您覆盖使用Revealing Module创建的实例时,依赖方法walkAndTalk()
也不会选择该更改。其根本原因在于,Revealing Module模式鼓励不加思索地使用javaScript闭包来帮助那些没有费心去学习this
的人。有关模块模式变体之间差异的比较,请参阅此post of mine。
答案 1 :(得分:0)
在您的示例中,实际上没有区别(除了constructor
等的细微差别之外)两者都返回一个对象,其中附加了每个方法的新副本。如果talk
和walk
属于module.prototype
,则会有所不同。