什么时候应该在Javascript中使用class表达式?

When we should use class expression in Javascript?

我最近了解到我们也有 class 表达式,就像 JS 中的函数表达式一样。我知道一些关于它的观点(MDN),比如:

  1. Class 表达式可以省略 class 名称(“绑定标识符”),这在 class 语句中是不可能的。

  2. Class 表达式允许您重新定义(重新声明)classes 而不会引发 SyntaxError。

我知道它有什么用,但是应该在哪里使用呢? class使用 class 表达式无法通过 class 语句实现或反之亦然的例子是什么?

没有那么多,但任何时候你使用 class 作为 right-hand 值,你会自动使用 class 表达式(就像 function 表达式).

  • 我见过 class 表达式的一个地方是包装 classes:

    function withLogging(BaseClass) {
         // The object is purely temporary, so we set the
         // name of the class dynamically
         const subclassName = BaseClass.name + "WithLogging";
         const obj = {
             [subclassName]: class extends BaseClass {
                 log(msg) { console.log(msg); }
             },
         };
         return obj[subclassName];
    }
    

    不是说这是个好主意(我可能会使用混合或组合而不是继承),但我已经看到它完成了。

       
       function withLogging(BaseClass) {
           // The object is purely temporary, so we set the
           // name of the class dynamically
           const subclassName = BaseClass.name + "WithLogging";
           const obj = {
               [subclassName]: class extends BaseClass {
                   log(msg) { console.log(msg); }
               },
           };
           return obj[subclassName];
       }
       
       const X = withLogging(class Example { });
       console.log(X.name);
       new X().log("Hi there");
       
       
    

  • 看起来class表达式但实际上比默认导出未命名class更奇特的东西:

    export default class { /*...*/ }
    

    真的不喜欢那个,因为 A) 我不喜欢默认导出,B) 我不喜欢未命名的 functions/classes (除了非常简单的回调函数,例如 mapnew Promise).

    它在技术上是一个匿名的 class 声明 (就像匿名函数声明一样),但它与 class 表达式非常相似. (默认导出案例是规范允许匿名 class 或函数声明的唯一地方。)

  • 如果您正在创建一个包含多个 class 的对象:

    const classes = {
         A: class A { /*...*/ },
         B: class B { /*...*/ },
         C: class C { /*...*/ },
    };
    

    (我不认为我曾经这样做过,但是...)

Class表达式常用于子类工厂:

function createClass(…) {
    return class extends … {
        …
    };
}

这种模式很常见,例如React higher-order components or one style of mixin implementation.

What can be a classical example of using a class expression that can't be achieved with class statements or vice-versa?

没什么,真的。就像函数声明与表达式一样,它们不提供彼此无法实现的功能,而只是提供在特定场景下更令人愉悦的语法。