类表达式可以省略类名(“绑定标识符”),而使用类语句则不行。
类表达式允许您重新定义(重新声明)类,而不会抛出SyntaxError。
类表达式可以省略类名(“绑定标识符”),而使用类语句则不行。
类表达式允许您重新定义(重新声明)类,而不会抛出SyntaxError。
类表达式通常用于子类工厂:
function createClass(…) {
return class extends … {
…
};
}
实际上没有。就像函数声明与表达式一样,它们不提供另一种无法实现的功能,而只是在特定情况下提供更令人愉悦的语法。使用类表达式的经典示例是什么,无法使用类语句实现,反之亦然?
虽然不多,但只要你在将 class
用作右值时,就会自动使用类表达式(就像使用 function
表达式一样)。
One place I've seen class
expressions used is when wrapping 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];
}
I'm not saying that's a good idea (I'd probably use a mixin, or composition rather than inheritance), but I've seen it done.
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");
Something that looks like a class
expression but is in fact more exotic than that is default exporting an unnamed class:
export default class { /*...*/ }
I really don't like that one, because A) I don't like default exports, and B) I don't like unnamed functions/classes (other than really simple callback functions, for instance to map
or new Promise
).
It's technically an anonymous class
declaration (just as the equivalent would be an anonymous function declaration), but it's very similar to a class
expression. (The default export case is the only place the specification allows anonymous class
or function declarations.)
If you were creating an object with several classes on it:
const classes = {
A: class A { /*...*/ },
B: class B { /*...*/ },
C: class C { /*...*/ },
};
(I don't think I've ever done that, but...)
return class extends BaseClass { ... }
。 - undefinedname
属性。 - undefined