ES6新特性之类(Class)和继承(Extends)相关概念与用法分析


Posted in Javascript onMay 24, 2017

本文实例讲述了ES6新特性之类(Class)和继承(Extends)相关概念与用法。分享给大家供大家参考,具体如下:

一、类(Class)

1.基本语法

JavaScript语言的传统方法是通过构造函数,定义并生成新对象。下面是一个例子

function Point(x, y) {
  this.x = x;
  this.y = y;
}
Point.prototype.toString = function () {
  return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);

ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用ES6的“类”改写,就是下面这样。

//定义类
class Point {
  constructor(x, y) {  //constructor 构造方法
    this.x = x;
    this.y = y;
  }
  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
var p = new Point(1, 2);

构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,类的所有方法都还是定义在类的prototype属性上面。

2.constructor方法

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

二、继承(Extends)

Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }
  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}

上面代码中,constructor方法和toString方法之中,都出现了super关键字,它在这里表示父类的构造函数,用来新建父类的this对象。

子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

三、原生构造函数继承

原生构造函数是指语言内置的构造函数,通常用来生成数据结构。ECMAScript的原生构造函数大致有下面这些。以前,这些原生构造函数是无法继承的。

Boolean()
Number()
String()
Array()
Date()
Function()
RegExp()
Error()
Object()

ES6允许继承原生构造函数定义子类,因为ES6是先新建父类的实例对象this,然后再用子类的构造函数修饰this,使得父类的所有行为都可以继承。下面是一个继承Array的例子。

class MyArray extends Array {
  constructor(...args) {
    super(...args);
  }
}
var arr = new MyArray();
arr[0] = 12;
arr.length // 1
arr.length = 0;
arr[0] // undefined

上面代码定义了一个MyArray类,继承了Array构造函数,因此就可以从MyArray生成数组的实例。这意味着,ES6可以自定义原生数据结构(比如Array、String等)的子类,这是ES5无法做到的。

四、Class的Generator方法

如果某个方法之前加上星号(*),就表示该方法是一个Generator函数。

class Foo {
  constructor(...args) {
    this.args = args;
  }
  * [Symbol.iterator]() {
    for (let arg of this.args) {
      yield arg;
    }
  }
}
for (let x of new Foo('hello', 'world')) {
  console.log(x);
}
// hello
// world

上面代码中,Foo类的Symbol.iterator方法前有一个星号,表示该方法是一个Generator函数。Symbol.iterator方法返回一个Foo类的默认遍历器,for...of循环会自动调用这个遍历器。

五、Class的静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

class Foo {
  static classMethod() {
    return 'hello';
  }
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function

上面代码中,Foo类的classMethod方法前有static关键字,表明该方法是一个静态方法,可以直接在Foo类上调用(Foo.classMethod()),而不是在Foo类的实例上调用。如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。

父类的静态方法,可以被子类继承。

class Foo {
  static classMethod() {
    return 'hello';
  }
}
class Bar extends Foo {
}
Bar.classMethod(); // 'hello'

上面代码中,父类Foo有一个静态方法,子类Bar可以调用这个方法。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js 解决“options为空或不是对象”
Dec 22 Javascript
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
Event altKey,ctrlKey,shiftKey属性解析
Dec 18 Javascript
node.js实现逐行读取文件内容的代码
Jun 27 Javascript
基于jQuery实现表格内容的筛选功能
Aug 21 Javascript
js style.display=block显示布局错乱问题的解决方法
Sep 21 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
javascript 中关于array的常用方法详解
May 05 Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
浅谈vue项目重构技术要点和总结
Jan 23 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
Nov 29 Javascript
基于javascript实现放大镜特效
Dec 03 Javascript
使用jQuery.Pin垂直滚动时固定导航
May 24 #jQuery
bootstrap table使用入门基本用法
May 24 #Javascript
Vue动态实现评分效果
May 24 #Javascript
Angular.js指令学习中一些重要属性的用法教程
May 24 #Javascript
jquery append与appendTo方法比较
May 24 #jQuery
php 修改密码实现代码
May 24 #Javascript
详解VueJs前后端分离跨域问题
May 24 #Javascript
You might like
xajax写的留言本
2006/11/25 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
range 标准化之获取
2011/08/28 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python数据结构之链表详解
2017/09/12 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python包和模块的分发详细介绍
2020/06/19 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
出纳岗位职责模板
2013/11/27 职场文书
转预备党员政审材料
2014/02/06 职场文书
手工社团活动方案
2014/02/17 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
人生遥控器观后感
2015/06/11 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript