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 相关文章推荐
用正则xmlHttp实现的偷(转)
Jan 22 Javascript
JSON 学习之完全手册 图文
May 29 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
Apr 19 Javascript
使用javascript创建快捷方式的简单实例
Aug 09 Javascript
JS保留两位小数 四舍五入函数的小例子
Nov 20 Javascript
jquery 设置style:display的方法
Jan 29 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
Mar 21 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
javascript函数的节流[throttle]与防抖[debounce]
Nov 15 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
js实现弹幕墙效果
Dec 10 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
推荐文章系统(一)
2006/10/09 PHP
如何在PHP中进行身份认证
2006/10/09 PHP
PHP文本操作类
2006/11/25 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python正则表达式匹配HTML页面编码
2015/04/08 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
上课睡觉检讨书
2014/01/28 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
2014年教研工作总结
2014/12/06 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS