ES6对象的super关键字

Stella981
• 阅读 662

super是es6新出的关键字,它既可以当作函数使用,也可以当作对象使用,两种使用方法不尽相同

1.super用作函数使用的时候,代表父类的构造函数,es6规定在子类中使用this之前必须先执行一次super函数,super相当于Father.prototype.constructor.call(this)

class Father{
    constructor(){
        this.a = 1;
    }
}
class Son extends Father{
    constructor(){
        super();
    }
}

2.super用作对象的时候,在普通方法中指向父类的原型对象,在静态方法中指向父类

子类中使用super无法访问Father的实例属性a,可以访问原型对象上的p

class Father {
    constructor() {
        this.a = 1;
    }
    p() {      console.log(thia.a);
        console.log('hello');
    }
}
class Son extends Father {
    constructor() {
        super();     this.a = 2;
        super.p();//'2 hello'   Father.prototype.p()方法内部的this指向的是子类实例
        super.a;//undefined
    }
}
  • 静态方法中指向的是父类,而非父类的构造函数

  • static method中super指向父类Parent,相当于访问Parent.myMethod

  • 普通  method中super指向父类Parent的prototype,相当于访问Parent.prototype.myMethod

    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); //super指向父类因此访问的是static myMethod } myMethod(msg) { super.myMethod(msg); //super指向的是父类的构造函数,访问的是Parent.prototype.myMethod } } Child.myMethod(222);//static 222

    let child = new Child; child.myMethod(111);//instance 111

点赞
收藏
评论区
推荐文章
Jacquelyn38 Jacquelyn38
3年前
你不可不知的JS面试题(第二期)
1、什么是继承?子类可以使用父类的所有功能,并且对功能进行扩展。新增方法改用方法(1)、ES6使用extends子类继承父类的方法。// 父类    class A        constructor(name)            this.name name;                getNa
Stella981 Stella981
3年前
Python中super的用法
super是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用super,不要一半一半。普通继承classFooParent(object):de
Stella981 Stella981
3年前
ES6中的super
对象方法中的super原型对于javascript来说非常重要,甚至可以说是javascript中最为重要的知识点。然而,很多人一看到原型就懵逼。ES5我们可以使用Object.getPrototypeOf()来返回原型对象,使用Object.setPrototypeOf()来设置原型对象。看下面的例子:letpe
Stella981 Stella981
3年前
Python3中的super()函数详解
关于Python3中的super()函数我们都知道,在Python3中子类在继承父类的时候,当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法,那么,如果我们想实现同时调用父类和子类中的同名方法,就需要使用到super()这个函数,用法为super().函数名()下面是一个例子:
Wesley13 Wesley13
3年前
Java基础学习总结(8)——super关键字
一、super关键字  在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
Stella981 Stella981
3年前
Smali语法学习四
HelloWorldAHelloWorldDEMO.classpublicLHelloworld;第一行是类的声明.superLjava/lang/Object;super关键字,是父类的声明.methodpublicstaticmain(Ljava/lang/Stri
Wesley13 Wesley13
3年前
ES6 箭头函数
一、在es6中函数的定义和es5之间有明显区别。不需要关键字function来进行定义,使用来指向函数。不可以new也就是做构造函数以及没有arguments参数。箭头函数的this是在定义的时候确定指向这和es5不一样,es5是谁调用他,他就指向谁。1document.addEventListene
Wesley13 Wesley13
3年前
ES6特性总结(3)——函数的变化
前言es6中的一系列关于函数用法的变化是非常有趣的,在es6的新标准下,你可以更加轻便地使用函数,并且可以仿照面向对象编程的思想来使用函数,将函数转化为“类”。(这里的类加了引号,原因我们会在后面的学习中解释)下面就让我们来一起看一看es6下的函数有哪些有趣的变化。1.箭头函数箭头函数是es6下实现的一种新的函数书写方法。在过去的
Stella981 Stella981
3年前
Executors.newSingleThreadExecutor结合javafx的Task更新进度条(三)
通过在service的相关函数中打印线程ID,代码如下:classProgressBarServiceextendsService<Integer{@Overrideprotectedvoidready(){super.ready();System._out_.println("ProgressBarS
Wesley13 Wesley13
3年前
JS创建对象模式7种方法详解
创建对象的几种模式虽然Object构造函数或者字面量,都可以用来创建对象,但这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的代码,于是,工厂模式诞生了1工厂模式工厂模式是广为人知的设计模式,抽象了创建具体对象的过程。在ES6的Class创建类之前,是无法创建类的,开发人员就发明了一种函数,用函数来封