ES6之Class继承

客官°小女子只卖身不卖艺 2022-12-15 14:04 140阅读 0赞

Class 可以通过extends关键字实现继承

  1. class ColorPoint extends Point {
  2. constructor(x, y, color) {
  3. super(x, y); // 调用父类的constructor(x, y)
  4. this.color = color;
  5. }
  6. toString() {
  7. return this.color + ' ' + super.toString(); // 调用父类的toString()
  8. }
  9. }
  10. super关键字,它在这里表示父类的构造函数,用来新建父类的this对象。
  11. 子类必须在constructor方法中调用super方法,否则新建实例时会报错。
  12. 这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造
  13. class Point {
  14. constructor(x, y) {
  15. this.x = x;
  16. this.y = y;
  17. }
  18. }
  19. class ColorPoint extends Point {
  20. constructor(x, y, color) {
  21. this.color = color; // ReferenceError
  22. super(x, y);
  23. this.color = color; // 正确
  24. }
  25. }
  26. super()只能用在子类的构造函数之中,用在其他地方就会报错。

ES6 规定,在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例。

  1. class A {
  2. constructor() {
  3. this.x = 1;
  4. }
  5. print() {
  6. console.log(this.x);
  7. }
  8. }
  9. class B extends A {
  10. constructor() {
  11. super();
  12. this.x = 2;
  13. }
  14. m() {
  15. super.print();
  16. }
  17. }
  18. let b = new B();
  19. b.m() // 2

由于this指向子类实例,所以如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性。

  1. class A {
  2. constructor() {
  3. this.x = 1;
  4. }
  5. }
  6. class B extends A {
  7. constructor() {
  8. super();
  9. this.x = 2;
  10. super.x = 3;
  11. console.log(super.x); // undefined
  12. console.log(this.x); // 3
  13. }
  14. }
  15. let b = new B();
  16. super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x的时候,
  17. 读的是A.prototype.x,所以返回undefined

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6 class类的继承

    类的继承:`extends`关键字用于[类声明][Link 1]或者[类表达式][Link 2]中,以创建一个类,该类是另一个类的子类。 `extends`关键字用来创建一个

    相关 es6中的class继承

    前言: > 传统的javascript中只有对象,没有类的概念。它是基于原型的面向对象语言。原型对象特点就是将自身的属性共享给新对象。这样的写法相对于其它传统面向对象语言

    相关 ES6Class

    Class 的静态属性和实例属性 静态属性指的是 Class 本身的属性,即`Class.propName`,而不是定义在实例对象(`this`)上的属性。 c