前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端测试题:(解析)js中关于类(class)的继承的说法,下面错误的是?

前端测试题:(解析)js中关于类(class)的继承的说法,下面错误的是?

作者头像
舒克
发布2020-08-25 10:06:37
8870
发布2020-08-25 10:06:37
举报

考核内容: Class 的继承

题发散度: ★★

试题难度: ★★

解题思路:

Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。

class Father {}

class Child extends Father {}

上面代码定义了一个Father类,该类通过extends关键字,继承Father类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Father类。

子类必须在constructor方法中调用super方法,否则新建实例时会报错。

这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象。只有调用super之后,才可以使用this关键字,否则会报错。这是因为子类实例的构建,基于父类实例,只有super方法才能调用父类实例。

代码语言:javascript
复制
class Father {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}
class Child extends Father {
  constructor(x, y, color) {
    this.color = color; // 错误写法
    super(x, y);
    this.color = color; // 正确
  }
}

如果子类没有定义constructor方法,这个方法会被默认添加,代码如下。

代码语言:javascript
复制
class  subChild extends Father{ }
// 等同于
class subChild extends Father {
  constructor(...args) {
    super(...args);
  }
}

也就是说,不管有没有显式定义,任何一个子类都有constructor方法。

super 关键字

super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。

  • 第一种情况,super作为函数调用时,代表父类的构造函数
代码语言:javascript
复制
class A {}
class B extends A {
  constructor() {
    super();
  }
}

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

super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B的实例,

因此super()在这里相当于A.prototype.constructor.call(this)。

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

代码语言:javascript
复制
class A {}
class B extends A {
  m() {
    super(); // 报错
  }
}
  • 第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。
代码语言:javascript
复制
class A {
  p() {
    return 2;
  }
}
class B extends A {
  constructor() {
    super();
    console.log(super.p()); // 2
  }
}

子类B当中的super.p(),就是将super当作一个对象使用。这时,super在普通方法之中,指向A.prototype,所以super.p()就相当于A.prototype.p()。

代码语言:javascript
复制
class A {}
A.prototype.x = 2;


class B extends A {
  constructor() {
    super();
    console.log(super.x) // 2
  }
}

答案:错误的是

代码语言:javascript
复制
B. 如果类没有定义constructor方法,这个子类就没有constructor方法。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 迈向前端工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档