1、ES6的class语法与ES5构造函数的相互转换

:::info ES6和ES5之间是相互进行转换的,ES5的代码都可以通过ES6进行重写,ES5中引入了类的概念,让我们在javascript中也可以使用类的语法,ES6中的类本质就是ES5中的构造函数。 :::

1.1 ES5传统类的书写规则

  1. // es5的方法 类的创建 使用构造函数来完成
  2. function Person(name, age) {
  3. this.name = name;
  4. this.age = age;
  5. }
  6. // 构造函数实例的方法 一般定义在构造函数的原型对象上
  7. Person.prototype.running = function() {
  8. console.log(this.name, this.age, "running");
  9. }
  10. // 生成类的实例化对象
  11. const person = new Persion("coderweiwei", 18);
  12. // 读取实例的属性
  13. person.name // "coderweiwei"
  14. person.age // 18
  15. // 执行实例的方法
  16. person.running() // "coderweiwei" 18 "running"
  17. // 注意:当我们访问实例对象的方法的时候,js引擎会先在我们实例对象本身进行寻找,如果找不到则在实例对象的构造函数上的原型上寻找,一直按照原型链的方式向上寻找访问,直到找到原型链的终点null为止。

1.2 使用ES6类语法升级ES5中构造函数的写法

  1. // es6 class 定义类、声明类
  2. class Person {
  3. constructor(name, age) {
  4. // 实例对象定义的属性
  5. this.name = name;
  6. this.age = age;
  7. }
  8. // 实例对象定义的方法 可直接在类里面进行定义
  9. running() {
  10. console.log(this.name, this.age, "running")
  11. }
  12. }
  13. // 生成实例化对象
  14. // 当我们使用new关键字生成实例化对象的时候 就会主动调用类中的constructor方法
  15. const p1 = new Person("coderweiwei", 13)
  16. p1.name // "coderweiwei"
  17. p1.age // 13
  18. p1.running() // "coderweiwei" 13 "running"

1.3 ES6类的继承

传统面向对象的三大原则

  • 封装
  • 继承
  • 多态

javascript的定位: javascript是一门基于对象的脚本语言,而不是面向对象。
ES6中继承的写法:

  1. // 没有继承的缺点
  2. // 声明一个公共类 声明人这个类
  3. class Person {
  4. // 构造方法
  5. constructor(name, age) {
  6. // 属性
  7. this.name = name;
  8. this.age = age;
  9. }
  10. // 实例方法
  11. running() {
  12. console.log(this.name, this.age, "running")
  13. }
  14. }
  15. // 声明学生类
  16. class Student {
  17. constructor(name, age, sno) {
  18. this.name = name; // 公有的属性
  19. this.age = age; // 公有的属性
  20. this.sno = sno;
  21. }
  22. running() { // 公有的方法
  23. console.log("在奔跑")
  24. }
  25. learn() {
  26. console.log("在学习")
  27. }
  28. }
  29. // 声明教师类
  30. class Teacher {
  31. constructor(name, age, title) {
  32. this.name = name; // 公有的属性
  33. this.age = age; // 公有的属性
  34. this.title = title;
  35. }
  36. running() { // 公有的方法
  37. console.log("running")
  38. }
  39. teach() {
  40. console.log("teaching")
  41. }
  42. }
  43. // 上述代码的缺点:
  44. // 1、代码的冗余太大,有太多的重复性代码 person类有name/age属性 我们的student类和teacher类都有相同的属性和方法。那么我们可以从父级中继承一部分公共的属性和方法、减少代码的冗余,针对自己特有的方法再进行声明使用。
  45. // 上述代码的改造
  46. class Student extends Person {
  47. constructor(name, age, sno){
  48. // 当我们需要继承父类的部分属性和方法时 需要调用super方法
  49. super(name, age);
  50. // 声明实例属性
  51. this.sno = sno;
  52. }
  53. // 声明实例的方法
  54. learn() {
  55. console.log("learning")
  56. }
  57. }
  58. // 教师类
  59. class Teacher extends Person {
  60. constructor(name, age, title) {
  61. super(name, age);
  62. // 声明实例的属性
  63. this.title = title;
  64. }
  65. // 声明实例的方法
  66. teach() {
  67. console.log("teach")
  68. }
  69. }