对于主要目标是创建另一个函数的闭包,我想知道在现代 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
不,课程并不“总是”更好。他们只是不同。我想说主要的区别是
构造函数/工厂函数返回的事物的接口。类实例具有属性和方法,并且通常是多个属性和方法,而闭包只是一个可以调用的函数 - 具有单个功能。调用它们的语法不同,额外的方法名称有时是多余的,有时是有益的。class
创建对象。你只需要一个函数来调用吗?然后创建一个闭包。
范围通常应尽可能受到限制并且您不希望类的正确性取决于类的使用者不修改它(无论是意外还是故意)。
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...
除非出现奇怪的特殊情况
)。如果您要使用类,并且想要模拟闭包的隐私性,请确保使用私有类字段,这样它们就无法在类之外进行修改。
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...
课程并不总是更好。这确实取决于具体情况。每个在您的编程工具集中都有自己的位置。
语言中有定义的语法
new countPlusClass()
对于具有很多方法的对象,
class
开发人员工具将识别类的实例并知道如何显示它、在为其键入代码时自动完成、如何在调试器中表示它、如何在错误消息中使用它等等...
闭包中的数据是完全私有的。没有人可以从封闭区域之外访问它。
我想说,对于给定的情况,这些工具之一可能更“适合”当前的问题。
正如评论中提到的,您还可以拥有可能是闭包(在闭包中保留私有状态)的工厂函数,并且可能返回带有方法和/或属性的对象,甚至可以是通过实例化类创建的对象。因此,这些概念也可以结合起来以获得两者的一些好处。