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. ColorCtr控制颜色渐变

    ColorCtr控制颜色渐变 public class ColorCtr : MonoBehaviour { public static global_color Instance;         ...

  2. mysql 8 修改root 密码

    主要参考:https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html 需要注意的是创建文件的时候需要保存为 utf-8 无 B ...

  3. docker~service将容器日志输出到fluentd

    我们把微小的服务发布到docker里,然后实现docker service启动它,保证了服务的高可用性,然后把服务产生的日志输出到fluentd,由它进行过滤和转发,存储到elasticsearch里 ...

  4. Windows 入门杂乱无章版

    windows入门 /users/username/appdata/roaming/microsoft/windows/start menu/startup目录中的应用程序是在该用户登录时启动的 /w ...

  5. DB2去重复的几种方法

    DB2去重的几种方法 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 例如下表:tabl ...

  6. ThinkPHP find大坑 不要随便用

    举例: M("User")->find(3); $m=M("User"); $m->userName="aaa"; $m-> ...

  7. 表单(form)成为 ajax 提交的表单(form)

    1.form <form id="ff" method="post"> <div> <label for="name&q ...

  8. ping过程详解

    原出处:http://wanicy.blog.51cto.com/509018/335207/ PS:这里只是给出了ping ip地址的例子,没有给出ping域名的例子. ping 域名还有域名转换成 ...

  9. 基于nodejs的DNS查询工具

    开始这个实例之前,我们简单谈一下Node.js吧,Node.js是一个由JavaScript书写而成的强大Web开发框架,它让开发强壮的.伸缩性良好的服务器端Web应用变得更加简单.容易.这种技术诞生 ...

  10. Python模块入门(二)

    一.模块的循环导入问题 在python工程中,由于架构不当,可能会出现模块间互相引用的情况.这时候需要通过一些方法来解决这个问题 1.重新设计架构,解决互相引用的关系. 2.把import语句放置在模 ...