现代 Javascript 中的闭包 VS 类

问题描述 投票:0回答:4

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

javascript class ecmascript-6 closures
4个回答
3
投票

不,课程并不“总是”更好。他们只是不同。我想说主要的区别是

构造函数/工厂函数返回的事物的接口。类实例具有属性和方法,并且通常是多个属性和方法,而闭包只是一个可以调用的函数 - 具有单个功能。调用它们的语法不同,额外的方法名称有时是多余的,有时是有益的。
  • 在 OOP 中,对象应该具有身份和状态。在 FP 中,函数应该是纯函数。当然,您不需要遵循特定的范例,无状态对象和不纯函数一样都很好(尽管也许可以称它们为“过程”),但在争论可读性和可维护性时请记住这些约定。
  • 所以请明智地选择。您(可能将来)需要多种方法吗?你封装状态了吗?然后使用
class

创建对象。你只需要一个函数来调用吗?然后创建一个闭包。

    


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: 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...
基于闭包的对象和类哪个更好?这取决于每个开发人员。

课程并不总是更好。这确实取决于具体情况。每个在您的编程工具集中都有自己的位置。

2
投票
A类有以下优点:

语言中有定义的语法

    您可以对一个类进行子类化来扩展它
  1. 您可以更轻松地拥有许多属性和许多方法。
  2. 方法自动不可枚举并在严格模式下运行。
  3. 使用类的代码中的语法在某种程度上自我描述了正在发生的事情,因为
  4. new countPlusClass()
  5. 清楚地表明您正在创建一个对象,该对象将具有方法和可能的状态。这在你展示的关闭中并不那么明显。
  6. 对于具有很多方法的对象,
    class
  7. 使用的原型有一些节省空间的好处。
  8. 开发人员工具将识别类的实例并知道如何显示它、在为其键入代码时自动完成、如何在调试器中表示它、如何在错误消息中使用它等等...
  9. 闭包具有以下优点:

闭包中的数据是完全私有的。没有人可以从封闭区域之外访问它。

    在某些情况下,调用者可能会发现使用闭包需要更少的代码,因为您进行了一个函数调用(有时传递参数),然后返回另一个函数,该函数然后实现了应该做的一件事(您提到的中间件)我想到了)。
  1. 所以,我想说,如果您想要或需要或重视该课程的任何好处,请使用该课程。

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

我想说,对于给定的情况,这些工具之一可能更“适合”当前的问题。

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



0
投票

这个文档说类实现比闭包使用更少的内存;因此,类的内存效率很高。

提到使用类实例化多个新对象使用内存中相同的蓝图。但是,闭包使用函数调用为每个对象创建创建一个单独的蓝图引用。

对此还有更多想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.