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

那么如何掌握类这项技能,让我来陪大家一起学习:

 1.super关键字

  1. super用在调用的时候有两种情况:

第一种情况,super作为函数调用时,代表父类的构造函数。
第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。

  1. class Person {
  2. constructor (name) {
  3. this.name = name;
  4. }
  5. height(){
  6. console.log(1);
  7. }
  8. static weight(){
  9. console.log(2);
  10. }
  11. }
  12. class Student extends Person {
  13. constructor (name, age) {
  14. super(); //代表父类的构造函数
  15. this.age = age;
  16. }
  17. height(){
  18. super.height(); //指向父类的原型对象
  19. }
  20. static weight(){
  21. super.weight(); //指向父类
  22. }
  23. }

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

总结下:

super 关键字用于调用一个对象的父对象上的函数。
super.prop 和 super[expr] 表达式在类 和 对象字面量 任何 方法定义 中都是有效的。
在构造函数中使用时,super关键字单独出现,必须在可以使用this关键字之前使用。此关键字也可用于调用父对象上的函数。

2.static关键字

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

静态方法调用直接在类上进行,而在类的实例上不可被调用。

静态方法通常用于创建 实用/工具 函数。

通过例子我们可以发现,静态方法是通过类名直接调用的

从另一个静态方法为了在同一个类的另一个静态方法中调用一个静态方法,你可以使用 this 关键字。

  1. class StaticMethodCall {
  2. static staticMethod() {
  3. return 'Static method has been called';
  4. }
  5. static anotherStaticMethod() {
  6. return this.staticMethod() + ' from another static method';
  7. }
  8. }
  9. StaticMethodCall.staticMethod();
  10. // 'Static method has been called'
  11.  
  12. StaticMethodCall.anotherStaticMethod();
  13. // 'Static method has been called from another static method'

从类的构造函数和其他方法静态方法不能直接在非静态方法中使用 this 关键字来访问。你需要使用类名来调用它们:CLASSNAME.STATIC_METHOD_NAME() 或者将其作为构造函数的属性来调用该方法: this.constructor.STATIC_METHOD_NAME().

  1. class StaticMethodCall {
  2. constructor() {
  3. console.log(StaticMethodCall.staticMethod());
  4. // 'static method has been called.'
  5. console.log(this.constructor.staticMethod());
  6. // 'static method has been called.'
  7. }
  8. static staticMethod() {
  9. return 'static method has been called.';
  10. }
  11. }

3.new.target 关键字

    new.target属性允许你检测函数或构造方法是否通过是通过new运算符被调用的。在通过new运算符被初始化的函数或构造方法中,new.target返回一个指向构造方法或函数的引用。在普通的函数调用中,new.target 的值是undefined。

怎么理解这段话,也就是说new.target的功能就是用来检测函数的调用是不是通过 new 去创建一个新对象的,而且new.target返回的是一个指向函数的引用,也就是说我们能够确定是哪个函数进行了new操作

  1. class A {
  2. constructor() {
  3. console.log(new.target.name);
  4. }
  5. }
  6.  
  7. class B extends A { constructor() { super(); } }
  8.  
  9. var a = new A(); // logs "A"
  10. var b = new B(); // logs "B"

new.target 最大的作用就是让构造器知道当前到底 new 的是哪个类。

延伸下。ES6之前怎么实现这个功能?

  1. var A = function A() {
  2. if(!(this instanceof A)) throw 'Constructor A requires "new"';
  3. // ···
  4. };

然而这依然可以通过 call 或 apply 来调用。比如:

  1. var a = A.call(Object.create(A.prototype));

那么用ES6就是下面这样操作了

  1. var A = function A() {
  2. if(!new.target) throw 'Constructor A requires "new"';
  3. // ···
  4. };

4.constructor关键字

构造方法是创建和初始化使用类创建的一个对象的一种特殊方法。

  1. class Square extends Polygon {
  2. constructor(length) {
  3. // 在这里调用父类的"length",赋值给矩形的"width"和"height"。
  4. super(length, length);
  5. // 注意:子类必须在constructor方法中调用super方法,否则新建实例时会报错。
  6. this.name = 'Square';
  7. }
  8.  
  9. get area() {
  10. return this.height * this.width;
  11. }
  12.  
  13. set area(value) {
  14. this.area = value;
  15. }
  16. }

如果没有显式定义,会默认添加一个空的constructor方法。对于基类"Base classes",默认构造方法如下:

  1. constructor() {}

对于派生类"Derived classes" ,默认构造方法如下:

  1. constructor(...args) {
  2. super(...args);
  3. }

Es6 类的关键 super、static、constructor、new.target的更多相关文章

  1. ES6 类

    ES6之前没有类的概念,一般采用以下方式来模仿类 基本的类声明语法 私有属性是实例中的属性,不会出现在原型上,且只能在类的构造函数中创建所有私有属性 PersonClass声明实际上创建了一个具有构造 ...

  2. ES6 类(Class)基本用法和静态属性+方法详解

    原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...

  3. React与ES6(三)ES6类和方法绑定

    React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...

  4. ES6中构造函数内super关键字的使用

    super关键字用于访问和调用一个对象的父对象上的函数. super.prop和super[expr]表达式在类和对象字面量任何方法定义中都是有效的. 语法 super([arguments]); / ...

  5. 封装的通过微信JS-SDK实现自定义分享到朋友圈或者朋友的ES6类!

    引言: 我们经常在做微信H5的过程中需要自定义分享网页,这个如何实现呢?请看如下的封装的ES6类及使用说明! /** * @jssdk js对象,包括appId,timestamp,nonceStr, ...

  6. 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法

    四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...

  7. static 类成员变量 和 static const类成员变量

    1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...

  8. C++ 不能在类体外指定关键字static

    C++ static 函数的问题 近日读 C++ primer 中static 一章 , 有这么一句话, “静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为const  ...

  9. php笔记(二)PHP类和对象之Static静态关键字

      PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...

随机推荐

  1. ubuntu16.04安装不上有道词典的解决办法

    转自:http://www.linuxdiyf.com/linux/21143.html ubuntu16.04安装不上有道词典,提示: le@hu-pc:~/下载$ sudo dpkg -i you ...

  2. CSS3浏览器兼容

    不同的浏览器需要不同的前缀 -webkit chrome和safari -moz firefox -ms ie -o opera 一个炫酷标题效果: HTML: <!DOCTYPE HTML&g ...

  3. Jmeter编写Base64加密函数

    方法一: 使用Beanshell Sampler.BSF Sampler等实现,现已Base64加密为例,脚本如下: import sun.misc.BASE64Decoder; String res ...

  4. Linux编译安装程序(使用configure、make、 make install)

    以安装vim为例. (vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面). 1.获取源文件 首先进入/usr/local下(只是为了方便处理安装文件,位置随意) 用git ...

  5. innodb关键特性之double write

    # 脏页刷盘的风险 两次写的原理机制 1.解决问题 2.使用场景 3.doublewrite的工作流程 4.崩溃恢复 # doublewrite的副作用 1.监控doublewrite负载 2.关闭d ...

  6. 如何写出面试官欣赏的Java单例

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 今天我们不谈单例模式的用途,只说一说如果在面试的时候面试官让你敲一段代码 ...

  7. ICMP--ping--Traceroute

    ICMP经常被认为是IP层的一个组成部分.它传递差错报文以及其他需要注意的信息. ICMP报文通常被IP层或更高层协议TCP或UDP使用. 一些ICMP报文把差错报文返回给用户进程   ICMP报文是 ...

  8. vsftp虚拟主机

    ################################Vsftp服务器实战##########################################3 文件传输协议,基于该协议FT ...

  9. python进阶(3):模块和包

    之前两天我们介绍了一些比较常用的模块,而我也说过会讲解什么是模块,今天我们就来分析分析模块和包,模块我们现阶段使用还可以而包的话现阶段我们基本很少会用到包,学的不是很清楚也没关系这些东西都是用的多了也 ...

  10. 国内阿里Maven仓库镜像及自己收集镜像库

    国内阿里Maven仓库镜像Maven配置文件Maven仓库速度快   国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. 最新更新:2016年11月11 ...