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. [转]Using the HTML5 and jQuery UI Datepicker Popup Calendar with ASP.NET MVC - Part 4

    本文转自:http://www.asp.net/mvc/overview/older-versions/using-the-html5-and-jquery-ui-datepicker-popup-c ...

  2. 小萝卜控机大师录制脚本(手机app自动化)

    手机自动化测试 之前发布过小萝贝控机大师与按键精灵结合实现手机自动化测试的功能,小萝贝控机大师升级了实现了更多手机自动化测试的功能,如下: l 手机功能自动化测试:录制脚本,检查点时点击小萝贝控机大师 ...

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

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

  4. Calendar计算一个月前的日期,踩坑记录

    错误示范:calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);//获取一个月前的今天这种写法假设传入的日期为2019-03-3 ...

  5. wait/notify

    某面试题,实现一个生产者——消费者模型 题目:采用多线程技术,通过wait/notify,设计实现一个符合生产者和消费者问题的程序,对某一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一 ...

  6. 设计模式之工厂模式详细读后感TT!(五)

    一如既往:原文 工厂方法(factory method)模式的意义是定义一个创建产品对象的工厂接口, 将实际创建工作推迟到子类当中. 核心工厂的创建, 这样核心类成为一个抽象工厂角色, 仅仅复制工厂子 ...

  7. jQuery的定时执行和延迟执行

    jQuery的定时执行和延迟执行 //延迟执行 setTimeout(function(){ console.log("实战授课,100%就业"); },600); //定时执行 ...

  8. XHTML教会我的一些东西-1

    第一次写博客,虽然以前写作文是我的强项,我也很能说,但是似乎现在这种能力正在退化.不知为什么,到了大学之后我就变得跟以前不一样,似乎是回到了小学时的我.我在大学开始变得内向.沉默.不去主动和别人交谈. ...

  9. MySQL连接服务端的几种方式

    一.MySQL 连接本地数据库,用户名为“root”,密码“123456”: D:\>mysql -h localhost -u root -p123456 注意:“-p”和“123456” 之 ...

  10. centos7服务器搭建javaweb运行环境及代码部署

    之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...