考试过程中有关于super和name属性的问题不是很明白,就把题目和解析都抄下来了,请老师解答一下

来源:4-1 ES6中class的继承

龍巛幽

2020-09-02 17:03:26

考试过程中有两道题不是很明白,就把题目和解析都抄下来了,请老师解答一下


——————————————————————分割线———————————————————


15. 多选题

 学习了类表达式,使用类的表达式的方式书写如下代码,哪一项不能正确输出“imooc”?(选择两项)


let person = class p{

constructor(){

console.log('imooc')

}

};

new p();


参考解析:


A 这个类的名字是person而不是p,p这个名字是无效的,所以通过 new p() 会报错。




17.观察下如下代码,输出结果为?(选择一项)


 let foo = class Foo {

      constructor(){

        this.name = 18;

      }

    }

    let f = new foo();

    console.log(foo.name);


参考解析:


正确答案为C,输出的是Foo。1、name属性输出的是类的名字。


2、如果类表达式中,类是有名字的,是类的名字,类没有名字的话,会是表达式中变量或者常量的名称。


——————————————————————分割线———————————————————



提问1:这两道题当中  15题说这个类的名字是person  也就是它赋值到的变量  而17题当中说name属性是Foo  不是foo  这是为什么?


——————————————————————分割线———————————————————



20.关于super关键字,下列说法正确的是?(选择一项)


A.super作为函数调用时,代表父类的构造函数


B.super中的this指向的是子类


C.在静态方法中访问super,指向父类的原型对象


D.在非静态方法中访问super,指向父类。


参考解析:


正确选项为A;


B:super中的this指向的是之类的this


C:非静态方法中,指向父类的原型对象


D:在静态方法中,指向父类。


——————————————————————分割线———————————————————


提问2:super中的this指向的是子类的this?那最终是指向什么?B选项中说的this指向子类啊,指向子类和指向子类的this有什么区别,可以用例子说明吗?


写回答

1回答

好帮手慕久久

2020-09-02

同学你好,问题解答如下:

1. 当使用let person = class p{}这种形式声明类时,比较特殊,此时实例化时,需要写成如下形式:

http://img.mukewang.com/climg/5f4f772c09746c9404570246.jpg

即new 关键字后面跟着的“类的名字”是person,而不是“p”,p是这个类的name属性,所以下一个类foo中,“foo.name”是获取的类foo的属性,值为Foo,它们对应关系如下:

http://img.mukewang.com/climg/5f4f774509d74b8904800357.jpg

而“如果类表达式中,类是有名字的,是类的名字,类没有名字的话,会是表达式中变量或者常量的名称”这句话的意思是如下:

http://img.mukewang.com/climg/5f4f7756098947e504700318.jpg

http://img.mukewang.com/climg/5f4f775e09cc765904250303.jpg

这点是es6规定好的,同学记住即可。

2. super中的this代表的子类的this,它最终指向的是用子类实例化出来的实例:

http://img.mukewang.com/climg/5f4f777c09b7dece05430473.jpg

所以super是指向子类的实例,而不是单纯的指向子类自身,所以B选项不够准确。还可以看下面的例子,如果super是指向子类的,那么实例化子类后(此时super方法会执行),子类上应该会有age属性,但实际并没有,如下:

http://img.mukewang.com/climg/5f4f779b09c5645d04910548.jpg

同学试着理解一下。

如果我的回答帮到了你,欢迎采纳,祝学习愉快!

0

0 学习 · 10739 问题

查看课程