extends 继承

extends 实现子类的继承
super() 表示父类的构造函数, 子类必须在 constructor中调用父类的方法,负责会报错。
子类的 this 是父类构造出来的, 再在子类的构造函数中进行丰富

class Prosen {

}
class Child extends Prosen {
  constructor() {}
}
// const child = new Child()
// console.log(child)  ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

此时子类Child没有this,因为没有在构造函数中调用super()函数

ES5继承和ES6继承的区别

ES5 继承, 先创造子类的 this, 再将父类的方法和属性添加到子类的 this上

ES6 继承 先将父类的属性和方法添加到 this上, 子类再通过 super()来获取 this之后改造。
子类实例的创建基于父类实例,只有super方法才能得到父类实例

class Zoo {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
    }
    class Dog extends Zoo {
      constructor(x,y,z) {
        super(x,y)
        this.z = z;
      }
    }
    const dog = new Dog(1,2,3)
    console.log(dog)
    console.log(dog instanceof Dog)  // true
    console.log(dog instanceof Zoo)  // true

super 关键字用法

  • 可以当函数使用
  • 也可以当对象使用

super 作为函数使用

super 作为函数使用时, 代表父类的构造函数。子类实现继承,必须要执行一次 super()。
super 代表父类的构造函数, 但却返回子类的实例。调用 super()相当于:
A.prototype.constructor.call(this) super(this) 内部的this指向的是子类。
super()函数只能在子类的 constructor函数中使用。

super作为对象使用

super 作为对象使用时, 在普通的方法中指向的是父类的原型对象, 在静态方法指向的是父类。
super作为父类的原型对象, 那么定义在父类实例对象上的属性和方法是无法调用的。
子类通过super对象调用父类原型上的普通方法时, 方法内部的 this指向当前子类实例。

class A {
    constructor(){
        this.x = 1
    }
}
class B extends A {
    constructor(){
        super()
    },
    m(){
         console.log(super.x)   // undefind
    }
}

super作为对象在子类的静态方法中使用

子类作为对象在普通方法中指向的是父类的构造函数。 super调用的父类构造函数方法中的this指向子类实例。
子类作为对象在静态方法中指向的是父类。super调用的父类的方法中的this指向的是子类,而不是子类的实例。

super图解

子类的__proto__和prototype.__proto__

class作为构造函数的语法糖, 它同时具有 __proto__和prototype属性。
假设: 父类为A, 子类为B
那么子类(B)的__proto__属性指向父类(A),这表示构造函数的继承
子类的原型对象(prototype)上也有__proto__属性,指向父类(A)的原型对象(prototype),它表示方法的继承。

图解

实例的__proto__

一句话, 实例的__proto__指向子类的原型,实例的__proto__的__proto__就是父类的原型对象。也就是父类实例的__proto__属性。

图解实例__proto__

待更新

ES6 extends继承及super使用读书笔记的更多相关文章

  1. C++ 的继承与虚函数 读书笔记

    一.类与类之间关系: 1.类与类之间可能会存在共性. 2.类与类之间必定会有差异. 3.为也节约开发时间和代码量,我们在设计类时可以把类的共享抽象出来形成一个基础类(基类). 4.使用基类+差异生成一 ...

  2. ES6读书笔记(二)

    前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,现在为第二篇,本篇内容包括: 一.数组扩展 二.对象扩展 三.函数扩展 四.Set和Map数据结构 五.Reflect 本文 ...

  3. ES6 读书笔记

    一.let和const命令 二.变量的解构赋值 三.字符串的扩展 四.数值的扩展 五.正则的扩展 六.数组的扩展 七.函数的扩展 八.对象的扩展 九.symbol 十.proxy和reflect 十一 ...

  4. 《深入理解ES6》读书笔记

    文章目录 第一章 块级绑定 1. var 声明与变量提升 2. let 与 var 的区别 第二章 字符串与正则表达式 1.字符串扩展 1.1 includes().startsWith() .end ...

  5. 通过原型继承理解ES6 extends 如何实现继承

    前言 第一次接触到 ES6 中的 class 和 extends 时,就听人说这两个关键字不过是语法糖而已.它们的本质还是 ES3 的构造函数,原型链那些东西,没有什么新鲜的,只要理解了原型链等这些概 ...

  6. 《C#图解教程》读书笔记之四:类和继承

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. ( ...

  7. ES6读书笔记(三)

    前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,<ES6读书笔记(二)>,现在为第三篇,本篇内容包括: 一.Promise 二.Iterator和for of循 ...

  8. ES6读书笔记(一)

    前言 前段时间整理了ES5的读书笔记:<你可能遗漏的JS知识点(一)>.<你可能遗漏的JS知识点(二)>,现在轮到ES6了,总共分为四篇,以便于知识点的梳理和查看,本篇内容包括 ...

  9. 【读书笔记】【深入理解ES6】#4-扩展对象的功能性

    对象类别 ES6规范清晰定义了每一个类别的对象. 普通(Ordinary)对象 具有JS对象所有的默认内部行为 特异(Exotic)对象 具有某些与默认行为不符的内部行为 标准(Standard)对象 ...

随机推荐

  1. Neutron命令测试4

    jolin@jolin:~$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface ...

  2. java 数字进制之间转换

    //10进制转换 16进制 System.out.println(Integer.toHexString(val)); System.out.println(String.format("% ...

  3. ZK典型应用场景

    1. 数据发布/订阅--动态获取数据 2.Master选举 a). 利用Zk会保证无法重复创建一个已经存在的节点 b). 多个客户端同时创建,创建成功的即是master,并监控master节点,一旦m ...

  4. Machine learning preface

    Machine learning Preface Definition T: Task E: Experience P: Performance Sequence: T -> E -> P ...

  5. IA-32e架构下的内核初始化内存管理

    初级内存管理单元 关于内存的分页 以往的物理页是按照4KB进行分配和管理的, 而在Linux之后流行的就是2MB大小的物理页的分配和管理, 整个物理内存管理单元也是2MB物理页管理的 先获取基本的物理 ...

  6. tck/tl 以及expect脚本

    最近有用到,利用expcet脚本自动登录到远程服务器并提权执行脚本. 搜集的知识如下: tcl/tk参考——列表操作lindex expect脚本解释 代码如下 #!/usr/bin/expect - ...

  7. node.js运行环境变量配置

    -----Windows cmd---------- 1. echo %PATH%  输出Path环境变量 2.set NODE_ENV=testing 定义环境变量 3.echo %NODE_ENV ...

  8. 一、简单gridview列表展示

    1.HomeController public ActionResult Index() { //返回绑定models的index.cshtml return View(NorthwindDataPr ...

  9. 定时备份oracle数据库脚本文件

    @echo off REM ########################################################### REM # Windows Server 2003下 ...

  10. Hibernate课程 初探一对多映射5-3 Eclipse根据表反向生成实体类

    1 配置 项目右击==>properties==>project facets==>convert to faceted form...复选框选中java 和 jpa==>fu ...