当前位置:   article > 正文

Class类的继承_class继承

class继承

一、继承的语法

1.子类继承父类——语法:class 子类 extends 父类,在子类的构造方法中调用父类的构造方法。

2.同名覆盖:子类中声明的方法名和父类中的方法名相同时,子类中的方法将覆盖继承于父类的方法,采用自己的。

3.super前面不能有this操作

  1. //父类Person
  2. class Person{
  3. constructor(name,sex){
  4. this.name = name;
  5. this.sex = sex;
  6. this.say = function(){
  7. console.log('say');
  8. };
  9. }
  10. speak(){console.log("speak")}
  11. static speak(){
  12. console.log("static speak")
  13. }
  14. }
  15. Person.version = '1.0';
  16. //一:子类继承父类——语法:class 子类 extends 父类
  17. class Programmer extends Person{
  18. //在子类的构造方法中调用父类的构造方法
  19. constructor(name,sex,feature){
  20. // this.feature = feature; 三:×错误写法,super前面不能有this操作
  21. super(name,sex);
  22. this.feature = feature;
  23. }
  24. //二:同名覆盖:子类中声明的方法名和父类中的方法名相同时,子类中的方法将覆盖继承于父类的方法,采用自己的。
  25. speak(){
  26. console.log("Programmer speak");
  27. }
  28. }
  29. const zs = new Programmer("张三","male","很高");
  30. console.log(zs.name,zs.sex,zs.feature); //张三 male 很高
  31. zs.say(); //say
  32. //子类使用了自己的speak方法:
  33. zs.speak();//Programmer speak
  34. Programmer.speak();//static speak

二、super()的特殊性

1.super作为函数调用

代表父类的构造方法,只能用在子类的构造函数中,用在其他地方就会报错;

super虽然代表了父类的构造方法,但是内部的this指向调用这个函数的类的实例

  1. //1.super作为函数调用
  2. //代表父类的构造方法,只能用在子类的构造函数中,用在其他地方就会报错
  3. //super虽然代表了父类的构造方法,但是内部的this指向调用这个函数的类的实例
  4. class Person{
  5. constructor(name){
  6. this.name = name;
  7. console.log(this);
  8. }
  9. }
  10. class Programmer extends Person{
  11. constructor(name){
  12. super(name);
  13. }
  14. fn(){
  15. // super(name);报错:Uncaught SyntaxError: 'super' keyword unexpected here
  16. }
  17. }
  18. const xh = new Programmer("小红","female");

2.super作为对象使用

(1).在子类的构造方法或一般方法中,super代表的是原型对象Person.prototype

  1. //2.作为对象使用:
  2. //(1).在子类的构造方法或一般方法中,super代表的是原型对象Person.prototype
  3. class Person{
  4. constructor(name){
  5. this.name = name;
  6. }
  7. speak(){
  8. console.log('speak');
  9. console.log(this);
  10. }
  11. }
  12. class Programmer extends Person{
  13. constructor(name){
  14. super(name);
  15. //在子类的构造方法中调用父类的原型的speak方法
  16. super.speak(); //speak this指向子类的实例
  17. }
  18. //在子类的一般方法中调用调用父类的原型的speak方法,再补充子类的其他功能:
  19. speak(){
  20. super.speak();//speak this指向子类的实例
  21. console.log("Programmer speak") //Programmer speak
  22. }
  23. }
  24. const xh = new Programmer("小红");
  25. xh.speak();

(2)在子类的静态方法中使用,super指向的是父类,而不是父类的原型对象,this指向子类

  1. //(2)在子类的静态方法中使用,super指向的是父类,而不是父类的原型对象
  2. class Person{
  3. constructor(name){
  4. this.name = name;
  5. }
  6. speak(){
  7. console.log('speak');
  8. console.log(this);
  9. }
  10. static speak(){
  11. console.log("Person static speak")
  12. }
  13. }
  14. class Programmer extends Person{
  15. constructor(name){
  16. super(name);
  17. }
  18. static speak(){
  19. super.speak();
  20. console.log("Programmer static speak")
  21. }
  22. }
  23. Programmer.speak();

 3.注意事项

使用super的时候,必须显示指定是作为函数使用还是作为对象使用(要么加括号,要么打点调属性方法),否则浏览器会报错。

当子类继承父类时,如果不需要通过constructor设置属性和继承父类constructor中的属性,那么可以不写constructor和super,否则,就必须写上constructor和super

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/78734
推荐阅读
相关标签
  

闽ICP备14008679号