super作为对象访问实例属性的问题

super作为对象访问实例属性的问题

老师课上讲,super指向父类的prototype,在子类中用super.speak()可以访问到父类的speck方法,但是却无法通过super.name访问父类的name属性,老师说是因为name是实例属性。

疑问:name确实是实例属性,speak不也是实例方法吗?为什么可以通过super访问到实例方法,却访问不到实例属性?为什么speak在父类的prototype上,而name不在?http://img1.sycdn.imooc.com//climg/6017ade00953fb3809300531.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,如下这样写,与在constructor中定义name是一样的(学法1与写法2等价):

http://img1.sycdn.imooc.com//climg/6017d02609d2b08a04800195.jpg

所以你会看到name也被添加到实例自身上了,因此super.name是undefined。

这是class内部代码帮我们实现的,只有定义的方法,才会被追加到原型对象上。

同学注意一下这个细节即可。

祝学习愉快!


好帮手慕久久 2021-02-01 17:11:28

同学你好,解答如下:

由于类和之前的构造函数很像,所以老师结合构造函数,给同学讲解。本题中,类Person对应如下构造函数:

http://img1.sycdn.imooc.com//climg/6017c3b109e0307808650706.jpg

从上图可以看到,name是通过this添加到实例上面的,即name处于实例自身上(构造函数中,使用this定义的属性是实例的属性)。speak这个方法,并不在实例自身上,它是在父类的原型对象prototype上(Person.prototype.XXX)。实例之所以能够访问到speak方法,并不是因为实例自身有该方法,而是因为实例可以通过原型链找到父类原型对象上的speak方法。

由于constructor中的super指向的是父类的原型对象prototype,所以可以通过super直接访问到speak方法。但是name不在原型对象prototype上,所以使用super访问不到name。

可以通过打印验证name在实例自身上:

http://img1.sycdn.imooc.com//climg/6017c52f09cee54c05710505.jpg

http://img1.sycdn.imooc.com//climg/6017c54a0973be3905160100.jpg

而speak方法,则是在原型链上:

http://img1.sycdn.imooc.com//climg/6017c58009e47ec204780237.jpg

祝学习愉快!

  • 提问者 weixin_慕雪1363253 #1

    老师,你上面讲的我看懂了,但是如果不在constructor中定义属性,为什么还是用super访问不到呢?打印实例,显示age属性和name一样,不管是不是在constructor中定义,都不会像say()一样放在父类原型中,这是为什么?

    http://img1.sycdn.imooc.com//climg/6017c8a909cc2f5303890224.jpg

    class People{
    name='张三'
    constructor(age){
    this.age=age
    }
    say(){
    console.log('People say')
    }
    }
    ​class Teacher extends People{
    constructor(age){
    super(age)
    console.log(super.name)
    }
    }
    var t=new Teacher(20)//打印 undefined
    console.log(t)


    2021-02-01 17:25:38
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师