ES6—super关键字

super关键字:

我们知道this关键字总是指向函数所在的当前对象,ES6又新增了另一个类似的关键字super,super关键字既可以当对象来用,也可以当函数使用。。。

第一种情况:

super作为函数来使用,代表父类的构造函数。ES6要求,子类的构造函数必须先先先(重要的事情写三遍)执行一次super函数。

class Father{
    constructor(){
        console.log("1");
    }
}
class Son extends Father{
    constructor(){
        super()
    }
}

上边代码中,子类Son的构造函数之中的super(),代表调用父类的构造函数。这是必须的,否则js引擎会报错。

注意,super虽然代表父类Father的构造函数,但是返回的是子类Son的实例,即super内部的this指的是Son的实例,因此super()在这里相当于Father.proptotype.constructor.call ( this )也就是让子类的调用父类里边的方法

class A{
    constructor(){
        console.log(new.target.name)
    }
}
class B extends A{
    constructor(){
        super()
    }
}
new A()//A
new B() // B

上边代码,B继承A,在super()执行的时候,指向了B类,而不是父类A,也就是说里边的this指向B。。。ES6规定,在子类普通方法中通过super调用父类的方法,方法内部的this指向当前的子类实例。。。

为了加深印象,我们在看一个例子:

class A{
    constructor(){
        this.name = "lxc"
    }
    showName(){
        return this.name
    }
}
class B extends A{
    constructor(){
        super()
        this.name = "hahah"//这里要注意顺序,先调用super(),在写属性,写的时候找了半天bug
    }
    fn(){
        console.log(super.showName())//hahah
    }
}
new B().fn()

当super作为函数时,super()只能在子类的构造函数中,用在其他地方就会报错。。。

class A{
    constructor(){
        console.log(new.target.name)
    }
}
class B extends A{
    c(){
        super()
    }
}
new B() // 报错:'super' keyword unexpected here

上边代码,super()用在了c方法中,报错!!!

第二种情况:

super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类

先看下在普通方法中:

var obj = {
  name:"xiaochen",
  say(){
    return super.name
  }
}
obj.__proto__.name = "lxc"
console.log(obj.say())//"lxc"

上边代码,我们手动在对象obj的原型上边(obj.__proto__指向Object构造函数的原型)添加属性name,调用say方法,会把原型上边的name属性值打印出来。。。当然obj.__proto__这种做法是不推荐的!!!

注意:super关键字,表示原型对象时,只能用在对象的方法之中,用在其他地方会报错。。。目前,只有对象的简写法可以让js引擎确认,是定义在对象的方法里。。。

class A{
    constructor(){
    }
    p(param){
        return param 
    }
}
class B extends A{
    constructor(){
        super()
        console.log(super.p("lxc"))
    }
}
new B() //lxc

上边代码,B类当中的super.p(),就是将super作为对象使用,这时super在普通方法里边,指向A.prototype,所以super.p()相等于A.prototype.p()。

这里要注意的是,super作为对象指向的是父级的原型,父级实例上边的方法或者属性是无法通过super调用的:

class A{
    constructor(){
        this.name = "lxc"
    }
}
class B extends A{
    constructor(){
        super()
        console.log(super.name)//undefined
    }
}
new B()

上边代码中,name是父类的实例里边的属性,super无法调用!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值