博客列表 >ES6中类的继承以及抽象类的实现

ES6中类的继承以及抽象类的实现

longlong
longlong原创
2020年09月07日 20:01:041244浏览

1. 使用原生的方式实现类的继承

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>类的继承:原生方式</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 父类
  11. function Phone(brand, price) {
  12. // 属性
  13. this.brand = brand;
  14. this.price = price;
  15. }
  16. // 公共方法/原型方法
  17. Phone.prototype.show = function () {
  18. return `手机品牌: ${this.brand}\n价格: ${this.price}\n`;
  19. };
  20. console.dir(Phone);
  21. // 子类
  22. function Tel(brand, price, color) {
  23. // 借助call()函数,实现继承,可传入父类中的参数
  24. Phone.call(this, brand, price);
  25. this.color = color;
  26. }
  27. console.dir(Tel);
  28. // 更新子类的原型对象
  29. Tel.prototype = Object.create(Phone.prototype);
  30. // 手工补上constructor
  31. Tel.prototype.constructor = Tel;
  32. // 子类重写父类中的方法
  33. Tel.prototype.show = function () {
  34. return Phone.prototype.show.call(this).concat(`${this.color}`);
  35. };
  36. // 实例化子类
  37. const apple = new Tel("苹果", 5500, "银色");
  38. console.log(apple.show());
  39. const vivo = new Tel("Vivo", 3800, "红色");
  40. console.log(vivo.show());
  41. // ƒ Phone(brand, price)
  42. // ƒ Tel(brand, price, color)
  43. // 手机品牌: 苹果
  44. // 价格: 5500
  45. // 银色
  46. // demo1.html:42 手机品牌: Vivo
  47. // 价格: 3800
  48. // 红色
  49. </script>
  50. </body>
  51. </html>

2. 使用ES6实现类的继承

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>使用ES6实现类的继承</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 父类
  11. class Dad {
  12. // 构造方法
  13. constructor(name, email) {
  14. this.name = name;
  15. this.email = email;
  16. }
  17. // 原型方法
  18. show() {
  19. return `姓名:${this.name}\n邮箱:${this.email}\n`;
  20. }
  21. }
  22. // 子类
  23. class Son extends Dad {
  24. constructor(name, email, age) {
  25. // super() 调用父类中的构造方法
  26. super(name, email);
  27. this.age = age;
  28. }
  29. // 重写父类中的原型方法
  30. show() {
  31. // return `${super.show()}年龄:${this.age}`;
  32. // super 调用父类中的原型方法
  33. return super.show().concat(`年龄:${this.age}`);
  34. }
  35. }
  36. // 实例化子类
  37. const son = new Son("jack", "jack@qq.com", 20);
  38. console.log(son.show());
  39. </script>
  40. </body>
  41. </html>

3. ES6抽象类的实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>ES6实现抽象类</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 抽象类:不能实例化,可以继承
  11. // 父类
  12. class A {
  13. constructor() {
  14. // new.target属性:一般用于构造函数中
  15. // 1. 当在class内部调用时,会返回当前class名
  16. // 2. 当有子类继承时,会返回子类
  17. // 3. 此属性就是用于检查new的时候作用于哪个构造函数
  18. if (new.target === A) {
  19. throw new Error("本类不允许被实例化");
  20. }
  21. }
  22. }
  23. // 子类
  24. class B extends A {
  25. constructor(length, width) {
  26. super();
  27. this.length = length;
  28. this.width = width;
  29. }
  30. show() {
  31. return `长:${this.length} * 宽:${this.width} = 面积:${
  32. this.length * this.width
  33. }`;
  34. }
  35. }
  36. // 实例化
  37. // 1. 实例化父类 报错
  38. // const demo1 = new A();
  39. // Uncaught Error: 本类不允许被实例化
  40. // 2. 实例化子类
  41. const demo2 = new B(2, 5);
  42. console.log(demo2.show());
  43. // 长:2 * 宽:5 = 面积:10
  44. </script>
  45. </body>
  46. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议