1.this和super的区别:

  • this关键词指向函数所在的当前对象
  • super指向的是当前对象的原型对象

2.super的简单应用

const person = {
name:'jack'
} const man = {
sayName(){
return super.name;
}
} Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //jack

3.super的另类实现

super.name
等同于
Object.getPrototypeOf(this).name【属性】
等同于
Object.getPrototypeOf(this).name.call(this)【方法】

4.super中的this指向(易混淆)

super.name指向的是原型对象person 中的name,但是绑定的this还是当前的man对象。

ES6 规定,在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例

const person = {
age:'20多了',
name(){
return this.age;
}
} const man = {
age:'18岁了',
sayName(){
return super.name();
}
} Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //18岁了

Object.getPrototypeOf(this).name指向的是person的name,绑定的this也是person

const person = {
age:'20多了',
name(){
return this.age;
}
} const man = {
age:'18岁了',
sayName(){
return Object.getPrototypeOf(this).name();
}
} Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //20多了

Object.getPrototypeOf(this).name.call(this)指向的是person的name,不过通过call改变了函数的执行上下文,所以this指向的还是man

const person = {
age:'20多了',
name(){
return this.age;
}
} const man = {
age:'18岁了',
sayName(){
return Object.getPrototypeOf(this).name.call(this)
}
} Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //18岁了

4.Class中的super

(1)Class中的 super(),它在这里表示父类的构造函数,用来新建父类的 this 对象

super()相当于Parent.prototype.constructor.call(this) 

class Demo{

     constructor(x,y) {
this.x = x;
this.y = y;
} customSplit(){
return [...this.y]
} } class Demo2 extends Demo{
constructor(x,y){
super(x,y);
} customSplit(){
return [...this.x]
} task1(){
return super.customSplit();
} task2(){
return this.customSplit();
}
} let d = new Demo2('hello','world');
d.task1() //["w", "o", "r", "l", "d"]
d.task2() //["h", "e", "l", "l", "o"]

(2)子类没有自己的this对象,而是继承父亲的this对象,然后进行加工。如果不调用super,子类就得不到this对象

class Demo2 extends Demo{
constructor(x,y){
this.x = x; //this is not defined
}
}

ES5的继承,实质上是先创造子类的实例对象this,然后再将父类的方法添加到this上(Parent.call(this)).
ES6的继承,需要先创建父类的this,子类调用super继承父类的this对象,然后再加工。

如果子类没有创建constructor,这个方法会被默认添加:

class Demo{
constructor(x) {
this.x = x;
}
} class Demo2 extends Demo{} let d = new Demo2('hello'); d.x //hello

(3) super 在静态方法之中指向父类,在普通方法之中指向父类的原型对象

class Parent {
static myMethod(msg) {
console.log('static', msg);
}
myMethod(msg) {
console.log('instance', msg);
}
}
class Child extends Parent {
static myMethod(msg) {
super.myMethod(msg);
}
myMethod(msg) {
super.myMethod(msg);
}
} Child.myMethod(1); // static 1 var child = new Child();
child.myMethod(2); // instance 2

---------------------
作者:TianyuCool
来源:CSDN
原文:https://blog.csdn.net/qq_35087256/article/details/82669618

js中的super的更多相关文章

  1. 不会JS中的OOP,你也太菜了吧!(第二篇)

    一.你必须知道的 1> 原型及原型链在继承中起到了关键的作用.所以你一定要理解他们.2> 不会JS中的OOP,你也太菜了吧!(第一篇) 二.继承的6种方法 1> 原型链继承 原型链继 ...

  2. 小结JS中的OOP(下)

    关于JS中OOP的具体实现,许多大神级的JS专家都给出了自己的方案. 一:Douglas Crockford 1.1 Douglas Crockford实现的类继承 /** * 原文地址:http:/ ...

  3. JS中的this 指向问题

    我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...

  4. 【js实例】js中的5种基本数据类型和9种操作符

    js中的5中基本数据类型 js标识符 第一个字符必须为字母,下划线,或美元符 其他字符可以是字母,下划线,美元符,数字 js标识符区分大小写 标识符不能使关键字和保留字 关键字: break do i ...

  5. 关于js中原生构造函数的继承

    前言 在如今快节奏的工作当中,很多基础的东西会渐渐地被丢掉.就如继承这个话题,写React的同学应该都是class xxx extends React.Component,然而这可以理解为es5的一个 ...

  6. node.js中通过stream模块实现自定义流

    有些时候我们需要自定义一些流,来操作特殊对象,node.js中为我们提供了一些基本流类. 我们新创建的流类需要继承四个基本流类之一(stream.Writeable,stream.Readable,s ...

  7. JS中的继承实现方式

    第一种:通过prototype来实现 prototype.html <!DOCTYPE html><html lang="en"><head> ...

  8. js中不能做变量名的字符

    JavaScript中不能作为变量名的关键字和保留字总结: 1.js中的关键字: break case catch continue default delete do else finally fo ...

  9. js中的new操作符与Object.create()的作用与区别

    js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...

随机推荐

  1. 用ASP.NET创建数据库

    小白的第一次使用: 程序员写程序,就好比一个物品的慢慢诞生,我们今天的这个例子就可以想象成一个物品慢慢的在编译的过程中,让我们所看到 一.创建我们所测试的项目 1.创建一个简单的带有模型层(Model ...

  2. C# - MD5验证

    前言 本篇主要记录:VS2019 WinFrm桌面应用程序实现字符串和文件的Md5转换功能.后续系统用户登录密码保护,可采用MD5加密保存到后台数据库. 准备工作 搭建WinFrm前台界面 如下图 核 ...

  3. Markdown 基础学习

    Markdown是什么?    Markdwon是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTLM格式发布.Markdown也可以理解为将以 MARKDOWN语法编写 ...

  4. TensorFlow、numpy、matplotlib、基本操作

    一.常量的定义 import tensorflow as tf #类比 语法 api 原理 #基础数据类型 运算符 流程 字典 数组 data1 = tf.constant(2,dtype=tf.in ...

  5. JPA笔记1 ManyToOne

    persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...

  6. JVM源码分析之MetaspaceSize和MaxMetaspaceSize的区别

    JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域内,在Java 7里,这个空间被称为永久代(Permgen),在Java 8里,使用元空间(Metaspace)代替了永久代. ...

  7. springboot读取自定义properties配置文件方法

    1. 添加pom.xml依赖 <!-- springboot configuration依赖 --> <dependency> <groupId>org.sprin ...

  8. 10、shell编程+流程控制+分支嵌套

    SHELL 编程     shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell)     shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. ...

  9. Jenkins + pipeline + Git + PHP (九)

    一.准备环境介绍 192.168.5.71 # gitlab 仓库IP 192.168.5.72 # 开发环境,用于提交代码等 192.168.5.150 # www.leon.com 运行wordp ...

  10. requests---requests简介

    在做接口测试的时候都会用到很多工具,如postman.jmeter.soupUI等工具,除了这些工具外,我们也可以用python的第3方库requests来做接口测试. request简介 reque ...