什么时候应该在Javascript中使用class表达式?
When we should use class expression in Javascript?
我最近了解到我们也有 class 表达式,就像 JS 中的函数表达式一样。我知道一些关于它的观点(MDN),比如:
Class 表达式可以省略 class 名称(“绑定标识符”),这在 class 语句中是不可能的。
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 (除了非常简单的回调函数,例如 map
或 new 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?
没什么,真的。就像函数声明与表达式一样,它们不提供彼此无法实现的功能,而只是提供在特定场景下更令人愉悦的语法。
我最近了解到我们也有 class 表达式,就像 JS 中的函数表达式一样。我知道一些关于它的观点(MDN),比如:
Class 表达式可以省略 class 名称(“绑定标识符”),这在 class 语句中是不可能的。
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 (除了非常简单的回调函数,例如
map
或new 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?
没什么,真的。就像函数声明与表达式一样,它们不提供彼此无法实现的功能,而只是提供在特定场景下更令人愉悦的语法。