写本《JavaScript简餐》系列文章的目的是记录在阅读学习《JavaScript高级程序设计(第4版)》一书时出现的各个知识点。虽是对读书的笔记和总结,但是希望它轻量、简洁、犀利,不会引起阅读疲劳,可以在碎片化时间和闲暇之余轻巧地沐浴一下知识点。每篇文章只针对一个小部分进行讲解式的梳理,来达到个人复习总结和分享知识的目的。
class Person {} const Person = class {}; // 都可以与函数表达式类似,类表达式在它们被求值前也不能引用。不过,与函数定义不同的是,虽然函数声明可以提升,但类定义不能。下面的示例给出了演示:
console.log(FunctionDeclaration); // [Function: FunctionDeclaration] function FunctionDeclaration() {} console.log(ClassExpression); // ReferenceError: Cannot access 'ClassExpression' before initialization class ClassExpression {}如此,函数提前使用没问题,会打印出相关信息,但是类要是在初始化前使用,那就会报ReferenceError错误。 另一个函数与类不同的地方是函数受作用域限制,但是类会受到块作用域限制。如下所示:
{ function FunctionDeclaration() {} class ClassExpression {} } console.log(FunctionDeclaration); // [Function: FunctionDeclaration] console.log(ClassExpression); // ReferenceError: ClassExpression is not defined像这样,如果将类定义在一个块中,在块的外部访问时,打印信息直接告诉我们没有定义类。 再来看一下类的构成,类可以包含构造函数方法、实例方法、获取函数、设置函数和静态类方法,不过类中不包含这些也同样有效。如下所示:
class Person() {}; //空类定义,有效 class Person { constructor() {} // 可以有构造函数 } class Person { sayName() {} // 可以有实例方法 } class Person { get myName() {} // 可以有获取函数 } class Person { set myName(name) {} // 可以有设置函数 } class Person { static sayName() {} // 可以有静态方法 }默认情况下类定义中的代码都会在严格模式下执行。类名建议首字母要大写,以区别于通过它创建的实例。(例如通过Class Person {}创建person实例)。 类表达式是可选的。在把类表达式赋值给变量后,可以通过name属性获取类表达式的名称字符串。但不能在类表达式作用域外部访问这个标识符。如下所示:
let Person = class PersonName { sayClassName () { console.log(Person.name, PersonName.name); } } let p = new Person(); p.sayClassName(); // PersonName PersonName console.log(Person.name); // PersonName console.log(PersonName.name); // ReferenceError: PersonName is not defined