[转]JavaScript ES6 class指南

前言

EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民。但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性。不过,它使代码的可读性变得更高,并且为今后版本里更多面向对象的新特性打下了基础

这样做的原因是为了保证向后兼容性。也就是,旧代码可以在不做任何hack的情况下,与新代码同时运行。

定义类

让我们回想一下在ES5中定义一个类的方式。通过不是很常用的Object.defineProperty方法,我可以定义一些只读的属性。

function Vehicle(make, year) {Object.defineProperty(this, 'make', {get: function() { return make; }});Object.defineProperty(this, 'year', {get: function() { return year; }});
}Vehicle.prototype.toString = function() {return this.make + ' ' + this.year;
}var vehicle = new Vehicle('Toyota Corolla', 2009);console.log(vehicle.make); // Toyota Corolla
vehicle.make = 'Ford Mustang';
console.log(vehicle.toString()) // Toyota Corolla 2009

很简单,我们定义了一个有两个只读属性和一个自定义toString方法的Vehicle类。让我们在ES6中来做一样的事情:

class Vehicle {constructor(make, year) {this._make = make;this._year = year;}get make() {return this._make;}get year() {return this._year;}toString() {return `${this.make} ${this.year}`;}
}var vehicle = new Vehicle('Toyota Corolla', 2009);console.log(vehicle.make); // Toyota Corolla
vehicle.make = 'Ford Mustang';
console.log(vehicle.toString()) // Toyota Corolla 2009

类声明

在ES6中,有两个声明类的方式。第一种方法叫作 类声明,这也是我们在上述例子中使用的方式。

class Vehicle {hello() {console.log('nice to meet you');}
}

有一个需要注意的地方是,类声明与函数声明不同,它不会被提升(hoisted)。例如,以下的代码工作正常:

console.log(helloWorld());function helloWorld() {return "Hello World";
}

但是,以下代码会抛出一个异常:

var vehicle = new Vehicle();class Vehicle {
}

类表达式

另一个定义类的方式叫做 类表达式。它与函数表达式的运行方式完全一样。一个类表达式可以是具名的也可以是匿名的。

var Vehicle = class {
}var Vehicle = class VehicleClass {constructor() {// VehicleClass is only available inside the class itself}
}console.log(VehicleClass); // throws an exception

静态方法

static关键字是ES6的另一个语法糖,它使静态方法声明也成为了一个一等公民。在ES5中,静态方法就像是构造函数的一个属性。

function Vehicle() {// ...
}Vehicle.compare = function(a, b) {// ...
}

在使用了新的static关键字后:

class Vehicle {static compare(a, b) {// ...}
}

在底层,JavaScript所做的,也只是将这个方法添加为Vehicle构造函数的一个属性。值得注意的是,你也可以用同样的语法为类添加静态属性。

类继承

旧的原型继承有时看起来让人非常头疼。ES6中新的extends关键字解决了这个问题。在ES5,我们是这么做的:

function Motorcycle(make, year) {Vehicle.apply(this, [make, year]);
}Motorcycle.prototype = Object.create(Vehicle.prototype, {toString: function() {return 'Motorcycle ' + this.make + ' ' + this.year;}
});Motorcycle.prototype.constructor = Motorcycle;

使用的新的extends关键字,看上去就清晰多了:

class Motorcycle extends Vehicle {constructor(make, year) {super(make, year);}toString() {return `Motorcycle ${this.make} ${this.year}`;}
}

super关键字也可以用于静态方法:

class Vehicle {static compare(a, b) {// ...}
}class Motorcycle extends Vehicle {static compare(a, b) {if (super.compare(a, b)) {// ...}}
}

上一个例子也展示了新的super关键字的用法。当你想要调用父类的函数时,这个关键字就显得十分好用。

在想要调用父类的构造函数时,你可以简单地将super关键字视作一个函数使用,如super(make, year)。对于父类的其他函数,你可以将super视作一个对象,如super.toString()。例子:kk:super指向原型对象

class Motorcycle extends Vehicle {toString() {return 'Motorcycle ' + super.toString();}
}

可被计算的方法名

当在class中声明属性时,定义属性名时,你可以使用表达式。这个语法特性在一些ORM类库中将会非常流行。例子:

function createInterface(name) {return class {['findBy' + name]() {return 'Found by ' + name;}}
}const Interface = createInterface('Email');
const instance = new Interface();console.log(instance.findByEmail());

最后

在当前,使用class关键字来声明类,而不使用原型,获得的仅仅是语法上的优势。但是,这个是一个适应新语法和新实践的好开始。JavaScript每天都在变得更好,并且通过class关键字,可以使各种工具更好得帮助你。

[转]JavaScript ES6 class指南相关推荐

  1. Airbnb JavaScript 编码风格指南(2018年最新版)

    Airbnb JavaScript 编码风格指南(2018年最新版) 访问此原文地址:http://galaxyteam.pub/didi-fe... 另外欢迎访问我们维护的https://www.t ...

  2. 《javascript面向对象编程指南》读书笔记

    <javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...

  3. javascript立体学习指南

    javascript立体学习指南 第一章:首先了解javascript 首先,什么是javascript? JavaStrip出生于1995年,是一种文本脚本语言,成都装修公司是一种动态的.弱类型的. ...

  4. 《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.1节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  5. 《JavaScript面向对象编程指南》——1.3 分析现状

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.3节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  6. 《JavaScript机器人编程指南》——1.7 小结

    本节书摘来异步社区<JavaScript机器人编程指南>一书中的第1章,第1.7节,作者:[美]Kassandra Perch(珀芝),更多章节内容可以访问云栖社区"异步社区&q ...

  7. 《JavaScript面向对象编程指南》——1.7 训练环境设置

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.7节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  8. 《JavaScript面向对象编程指南》—第128页错误指正

    最近在阅读<JavaScript面向对象编程指南第2版>,感觉很有帮助.今晚发现一个小错误,想指正一下. 如图,书中第128页: 书中的第三个例子代码如下: "potato&qu ...

  9. 《JavaScript机器人编程指南》——1.2 NodeBot是什么,基本词汇还有哪些

    本节书摘来异步社区<JavaScript机器人编程指南>一书中的第1章,第1.2节,作者:[美]Kassandra Perch(珀芝),更多章节内容可以访问云栖社区"异步社区&q ...

最新文章

  1. 服务器系统健康值计算算法,身体健康指数计算方法
  2. 全球及中国豪华游轮行业投资策略分析及“十四五“发展规划建议报告2021-2027年版
  3. html title 不显示_第2天:HTML 结构
  4. jQuery实现文字向上滚动
  5. mpvue 踩坑之src数据绑定出错
  6. java中String类是什么_Java中字符串的学习(一)String类的概述及常见方法使用
  7. 【推荐实践】图片主题模型在推荐系统的应用实践
  8. linux 常用到的命令(centos 6.5)
  9. 无法向会话状态服务器发出回话状态请求
  10. Nginx+php+mysql+wordpress搭建自己的博客站点
  11. java学习笔记---3
  12. Python文本处理(3)——文本表示之 one-hot 词向量(1)——纯小白都能懂!
  13. MATLAB实现平滑处理
  14. HIT 软件构造2019春 Lab3
  15. 太阳高度角与方位角计算
  16. 鼠标跟随flash代码_Flash动画设计之 MTV实例创作《不说再见》
  17. 买就赚到的以色列人工智能
  18. Cortex-M3和Cortex-M4 Fault异常基础知识
  19. 基于Hadoop的云计算平台配置
  20. 对话行癫:CTO 最重要的是判断未来!| 人物志

热门文章

  1. LeetCode Online Judge 题目C# 练习 - Minimum Path Sum
  2. VB.NET 委托处理 传递参数
  3. sql 2005 新增的查看sql语句运行情况
  4. 再议《反驳 吕震宇的“小议数据库主键选取策略(原创)” 》
  5. Centos7.6 下部署Cobbler
  6. 爱奇艺大数据分析平台的演进之路
  7. [算法]一次商品交易利益最大化
  8. 5.1 实验五 四则运算单元测试
  9. java中volatile关键字的含义
  10. 页面自动刷新html实现