对于闭包(它的主要目标是创建另一个函数),我想知道在现代javascript中,只使用现代javascript中的类更好。
// Closure way private counter
const countPlusOne = () => {
let count = 0;
return () =>{
count++;
console.log(count);
}
}
let demoAdd = countPlusOne();
demoAdd(); // 1
demoAdd(); // 2
demoAdd(); // 3老实说,我从来不喜欢以这种方式使用闭包(但我认为它们很适合那些难以阅读的中间件)。
那么,我是否应该像以前那样将闭包重构到类中呢?他们的行为似乎更类似于来自其他语言的典型对象。
// Class way private counter
class countPlusClass{
count = 0;
add(){
this.count++;
console.log(this.count)
}
}
const demo = new countPlusClass();
demo.add(); // 1
demo.add(); // 2
demo.add(); // 3发布于 2022-03-30 02:56:57
不,上课并不总是更好。他们只是不一样。我想说的主要区别是
时要记住这些约定。
所以明智地选择。你(可能在将来)需要多种方法吗?你封装状态吗?然后使用class创建对象。你只需要调用一个函数吗?然后创建一个闭包。
发布于 2022-03-30 02:26:06
上课并不总是更好。这真的要视情况而定。在您的编程工具集中,每个工具都有各自的位置。
一个类有以下优点:
在语言methods.
new countPlusClass()明确表示,您正在创建一个对象,然后该对象将具有方法和可能的状态。这一点在您显示的闭包中并不明显。对于具有许多方法的对象,uses.
关闭具有以下优点:
所以,我想说,如果您想要、需要或重视这个类的任何好处,那么就使用这个类。
如果您不想或不需要该类的任何好处,并且更简单的闭包接口满足您的需要,或者如果您确实需要闭包的隐私,那么您可以选择闭包。
我想说的是,在给定的情况下,这些工具中的一个可能更适合当前的问题。
正如注释中所提到的,您还可以拥有可能是闭包(在闭包中保留私有状态)的工厂函数,并且可以返回具有方法和/或属性的对象,这些方法和/或属性甚至可以是通过实例化类创建的对象。因此,这些概念也可以结合起来,以获得两者的一些好处。
发布于 2022-03-30 02:27:14
闭包比您想象中的类有很大的优势:对于类,如果像您一样使用公共类字段,任何访问实例的代码都可以修改其值。这通常是不可取的-- scope should generally be constrained as possible,并且您不希望类的正确性依赖于类的使用者,而不是修改它(不管是意外的还是故意的)。
class countPlusClass{
count = 0;
add(){
this.count++;
console.log(this.count)
}
}
const demo = new countPlusClass();
demo.add(); // 1
demo.add(); // 2
// some code elsewhere in the codebase that has access to the demo instance:
demo.count = 55555;
demo.add(); // not 3...
相反,闭包完全是私有的(barring strange, exceptional circumstances)。
如果要使用类,并且希望模拟闭包的隐私,请确保使用私有类字段,这样就不能在类之外对它们进行修改。
class countPlusClass{
#count = 0;
add(){
this.#count++;
console.log(this.#count)
}
}
const demo = new countPlusClass();
demo.add(); // 1
demo.add(); // 2
// some code elsewhere in the codebase that has access to the demo instance
// cannot modify the private field
demo.count = 55555;
demo.add(); // not 3...
至于哪一个更好,一个基于闭包的对象还是一个类?这取决于每个开发人员。
https://stackoverflow.com/questions/71670779
复制相似问题