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
最佳答案
在你的简单示例中没有什么区别,但让我让它变得更复杂一点。
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
}
};
使用这个
,
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 模式鼓励那些懒得正确学习 this
的人不加区别地使用 javaScript 闭包。看这个post of mine比较模块模式变体之间的差异。
关于javascript - 揭示模块模式和简单构造函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35581704/