首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代Javascript中的闭包与类

现代Javascript中的闭包与类
EN

Stack Overflow用户
提问于 2022-03-30 02:18:52
回答 3查看 1.4K关注 0票数 2

对于闭包(它的主要目标是创建另一个函数),我想知道在现代javascript中,只使用现代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

老实说,我从来不喜欢以这种方式使用闭包(但我认为它们很适合那些难以阅读的中间件)。

那么,我是否应该像以前那样将闭包重构到类中呢?他们的行为似乎更类似于来自其他语言的典型对象。

代码语言:javascript
复制
// 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-30 02:56:57

不,上课并不总是更好。他们只是不一样。我想说的主要区别是

  • 构造函数/工厂函数返回的对象的接口。类实例具有属性和方法,通常是多个属性和方法,而闭包只是一个可以调用的函数--只有一个功能。调用它们的语法是不同的,额外的方法名称有时是多余的,有时也是有益的。
  • 在OOP中,对象应该具有标识和状态。在FP中,函数应该是纯的。当然,您不需要遵循特定的范例,无状态对象和不纯的函数一样都是很好的(尽管那时可能称之为“过程”),但是在讨论可读性和maintainability.

时要记住这些约定。

所以明智地选择。你(可能在将来)需要多种方法吗?你封装状态吗?然后使用class创建对象。你只需要调用一个函数吗?然后创建一个闭包。

票数 3
EN

Stack Overflow用户

发布于 2022-03-30 02:26:06

上课并不总是更好。这真的要视情况而定。在您的编程工具集中,每个工具都有各自的位置。

一个类有以下优点:

在语言methods.

  • Methods

  • 中定义了语法,您可以将类子类扩展为

  • ,您可以更容易地拥有许多属性,并且许多

  • 自动不可枚举并在严格模式下运行。

  • 是代码中使用类的语法,在某种程度上描述了所发生的事情,因为new countPlusClass()明确表示,您正在创建一个对象,然后该对象将具有方法和可能的状态。这一点在您显示的闭包中并不明显。对于具有许多方法的对象,uses.

  • Developer工具将识别一个类的实例并知道如何显示它、在为其键入代码时自动完成、如何在调试器中表示它、如何在错误消息中使用它等,都可以节省一些空间。

关闭具有以下优点:

  1. 闭包中的数据是完全私有的。在某些情况下,调用方可能会发现使用闭包所需的代码较少,因为您进行了一个函数调用(有时传递参数),然后返回了另一个函数,然后实现了它应该做的一件事(想到了中间件)。

所以,我想说,如果您想要、需要或重视这个类的任何好处,那么就使用这个类。

如果您不想或不需要该类的任何好处,并且更简单的闭包接口满足您的需要,或者如果您确实需要闭包的隐私,那么您可以选择闭包。

我想说的是,在给定的情况下,这些工具中的一个可能更适合当前的问题。

正如注释中所提到的,您还可以拥有可能是闭包(在闭包中保留私有状态)的工厂函数,并且可以返回具有方法和/或属性的对象,这些方法和/或属性甚至可以是通过实例化类创建的对象。因此,这些概念也可以结合起来,以获得两者的一些好处。

票数 3
EN

Stack Overflow用户

发布于 2022-03-30 02:27:14

闭包比您想象中的类有很大的优势:对于类,如果像您一样使用公共类字段,任何访问实例的代码都可以修改其值。这通常是不可取的-- scope should generally be constrained as possible,并且您不希望类的正确性依赖于类的使用者,而不是修改它(不管是意外的还是故意的)。

代码语言:javascript
复制
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)。

如果要使用类,并且希望模拟闭包的隐私,请确保使用私有类字段,这样就不能在类之外对它们进行修改。

代码语言:javascript
复制
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...

至于哪一个更好,一个基于闭包的对象还是一个类?这取决于每个开发人员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71670779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档