- 前言
- 关于 ECMASCRIPT 发展史和现状
- ES6 带来的重大特性
- ES2016(ES7)的改进
- ES2017(ES8)带来的重大新特性
- ES2018(ES9)带来的重大新特性
- JavaScript 编码风格指南
- JavaScript 词法结构(构建块)
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 表达式
- 原型继承
- 如何使用 JavaScript 中的 Classes(类)
- JavaScript 异常处理
- JavaScript 中的分号(;)
- JavaScript 中的引号
- JavaScript 字面量模板(Template Literals)指南
- JavaScript 中的 function(函数)
- JavaScript 箭头函数(Arrow Function)
- JavaScript 中的闭包(Closures)
- JavaScript 数组(Arrays)
- JavaScript 中的循环(Loops)
- JavaScript 中的事件(Events)
- JavaScript 中的事件循环(Event Loop)
- JavaScript 异步编程和回调
- 理解 JavaScript 中的 Promises
- 用 async 和 await 编写现代 JavaScript 异步代码
- JavaScript 中的 循环(Loops) 和 作用域(Scope)
- JavaScript 定时器 setTimeout() 和 setInterval()
- JavaScript 中的 this
- JavaScript 严格模式(Strict Mode)
- JavaScript 中的 立即执行函数表达式(IIFE)
- JavaScript 中的数学运算符
- JavaScript 中的 Math 对象
- 介绍 ES Modules(模块)
- 介绍 CommonJS
- JavaScript 术语表
如何使用 JavaScript 中的 Classes(类)
2015 年,ECMAScript 6(ES6)标准引入了 Classes(类) 。
在此之前,JavaScript 只有一种非常独特的方式来实现继承。 它的原型继承虽然在我看来很棒,但与其他流行的编程语言不同。
来自 Java 或 Python 或其他语言的人很难理解原型继承的复杂性,因此 ECMAScript 委员会决定在它们之上引入一个语法糖,类似于基于类的继承在其他流行的实现中工作。
这很重要:引擎下的 JavaScript 实现仍然相同,您可以平常的方式继续访问对象原型。
定义一个 class(类)
这是一个班级的 class(类) 。
class Person { constructor(name) { this.name = name } hello() { return 'Hello, I am ' + this.name + '.' } }
一个类有一个标识符,我们可以使用它来使用 new ClassIdentifier()
创建对象实例。上述例子中你可以使用 new Person('test')
来创建。
初始化对象时,将调用 constructor
(构造函数) 方法,并传递一些参数。
一个类也有它需要的方法。 上述例子中, hello
是一个方法,可以在从该类派生的所有实例上调用:
const flavio = new Person('Flavio') flavio.hello()
类的继承
类可以扩展另一个类,使用该类初始化的实例对象继承这两个类的所有方法。
如果继承的类具有与上层次结构中较高的类之一具有相同名称的方法,则最接近的方法优先:
class Programmer extends Person { hello() { return super.hello() + ' I am a programmer.' } } const flavio = new Programmer('Flavio') flavio.hello()
上面的程序打印出 “Hello, I am Flavio. I am a programmer.”
类没有显式的类变量声明,但必须初始化构造函数中所有的变量。
在类中,您可以调用 super()
来引用父类。
静态方法
通常,方法是在实例上执行的,而不是在类上执行的。
静态方法在类上执行:
class Person { static genericHello() { return 'Hello' } } Person.genericHello() //Hello
私有方法
JavaScript 目前没有内置的方法来定义私有或受保护的方法。目前有很多 hack 方式解决,但我不会在这里描述它们。
值得注意的是 TC39 最近在 GitHub 上通过了一条 EMCAScript 语法特性的草案,即类私有属性修饰符 #
,不过,该特性之前在社区的调研中遭遇了大量反对。例如:
class Shape { #height; #width; constructor(width, height) { this.#width = width; this.#height = height; } get area() { return this.#width * this.#height; } } const square = new Shape(10, 10); console.log(square.area); // 100 console.log(square instanceof Shape); // true console.log(square.#width); // 错误:私有属性只能在类中访问
确实有点丑陋!本人更喜欢 TypeScript 的方式:
class Shape { private width; private height; constructor(width, height) { this.width = width; this.height = height; } get area() { return this.width * this.height; } } const square = new Shape(10, 10) console.log(square.area); // 100
getter 和 setter
您可以添加以 get
或 set
为前缀的方法来创建 getter 和 setter,这两个代码是根据您正在执行的操作执行的:访问变量或修改其值。
class Person { constructor(name) { this.name = name } set name(value) { this.name = value } get name() { return this.name } }
如果您只有一个 getter,则无法设置该属性,并且将忽略任何尝试这样做:
class Person { constructor(name) { this.name = name } get name() { return this.name } }
如果您只有一个 setter,则可以更改该值,但不能从外部访问它:
class Person { constructor(name) { this.name = name } set name(value) { this.name = value } }
关于 Classes(类)的更多详细信息可以查看 面向对象的 JavaScript – 深入了解 ES6 类
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论