gpt4 book ai didi

javascript - 揭示模块模式和简单构造函数之间的区别

转载 作者:行者123 更新时间:2023-11-28 18:44:37 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com