编程语言
首页 > 编程语言> > JavaScript简餐——类,那个男人回来了!

JavaScript简餐——类,那个男人回来了!

作者:互联网

文章目录


前言

写本《JavaScript简餐》系列文章的目的是记录在阅读学习《JavaScript高级程序设计(第4版)》一书时出现的各个知识点。虽是对读书的笔记和总结,但是希望它轻量、简洁、犀利,不会引起阅读疲劳,可以在碎片化时间和闲暇之余轻巧地沐浴一下知识点。每篇文章只针对一个小部分进行讲解式的梳理,来达到个人复习总结和分享知识的目的。


一、类

诸如C++和JAVA这类语言它们都有类这么一说,可以用来封装自己的类型。JavaScript也不能说没有,只不过一直以来都是用function()和ES5的特性来强撑出来一个这么一个“类”,但就是总感觉别扭,觉得它还不太正宗!正因如此,实现继承的代码也显得非常冗长和混乱,活像一锅东北铁锅炖。为解决这些问题,ES6中新引入了class关键字,具有正式定义类的能力。是的,那个男人回来了。虽然ES6的类表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的仍然是原型和构造函数的概念,是ES中新的基础性语法糖。

二、类定义

与函数类型相似,定义类也有两种主要方式:类声明和类表达式。这两种方式都使用class关键字加大括号。如下面的代码所示
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

三、总结

以上就是今天要讲的内容,今天简单地介绍了一下类的概念、类的定义方法、类的提升限制、类的作用域限制、以及类的构成和获取name标识符时要注意的作用域限制。下一篇我们来介绍一下类构造函数。撒花~

标签:console,name,PersonName,JavaScript,class,Person,简餐,男人,log
来源: https://blog.csdn.net/igodmeetu/article/details/120937662