作为一级公民的类
在编程中,能被当作值来使用的就称为一级公民(first-class citizen ) , 意味着它能作为参数传给函数、能作为函数返回值、能用来给变量赋值。JS
的函数就是一级公民(它们有时又被称为一级函数),此特性让 JS
独一无二。
ES6
延续了传统,让类同样成为一级公民。这就使得类可以被多种方式所使用。例如,它能作为参数传入函数:
function createObject(classDef) {
return new classDef();
}
let obj = createObject(class {
sayHi() {
console.log("Hi!");
}
});
obj.sayHi(); // "Hi!"
此例中的 createObject()
函数被调用时接收了一个匿名类表达式作为参数,使用 new
创建了该类的一个实例,并将其返回出来。随后变量 obj
储存了所返回的实例。
类表达式的另一个有趣用途是立即调用类构造器,以创建单例(Singleton
)。为此, 你必须使用 new
来配合类表达式,并在表达式后面添加括号。例如:
let person = new class {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}("Nicholas");
person.sayName(); // "Nicholas"
此处创建了一个匿名类表达式,并立即执行了它。此模式允许你使用类语法来创建单例,从而不留下任何可被探查的类引用(回忆一下 PersonClass
的例子,匿名类表达式只在类的内部创建了绑定,而外部无绑定)。类表达式后面的圆括号表示要调用前面的函数,并且还允许传入参数。
本章至今的例子都集中于带有方法的类,但你还能在类上创建访问器属性,所用的语法类似于对象字面量。