Classes
类是用于创建对象的模板,JS 的类建立在原型上

定义类

  • 类声明

    1. class Rectangle {
    2. constructor(height, width) {
    3. this.height = height;
    4. this.width = width;
    5. }
    6. }

    使用

    1. let p = Rectangle();

    类声明与函数声明的不同:函数申明会提升,类声明不会,必须先声明再使用,否则报错 ReferenceError

  • 类表达式

定义类的另一种方法,可以命名或不命名

  1. // 未命名/匿名类
  2. let Rectangle = class {
  3. constructor(height, width) {
  4. this.height = height;
  5. this.width = width;
  6. }
  7. };
  8. console.log(Rectangle.name); // "Rectangle"
  9. // 命名类
  10. let Rectangle = class Rectangle2 {
  11. constructor(height, width) {
  12. this.height = height;
  13. this.width = width;
  14. }
  15. };
  16. console.log(Rectangle.name); // "Rectangle2"

方法定义

  • 类体是 {} 中的部分,可以在里面定义类的方法或构造函数
  • 类声明和类表达式的主体都执行在严格模式下,如构造函数,静态方法,原型方法,getter和setter都在严格模式下执行。
  • 构造函数:用于创建和初始化由 class 创建的对象,每个 class 只能由一个,一个构造函数可以用 super 关键字来调用一个父类构造函数

    原型方法

    ```javascript class Rectangle { // constructor constructor(height, width) {
    1. this.height = height;
    2. this.width = width;
    } // Getter get area() {
    1. return this.calcArea()
    } // Method calcArea() {
    1. return this.height * this.width;
    } } const square = new Rectangle(10, 10);

console.log(square.area); // 100

  1. <a name="WAlGt"></a>
  2. ### 静态方法
  3. ```javascript
  4. class Point {
  5. constructor(x, y) {
  6. this.x = x;
  7. this.y = y;
  8. }
  9. static distance(a, b) {
  10. const dx = a.x - b.x;
  11. const dy = a.y - b.y;
  12. return Math.hypot(dx, dy);
  13. }
  14. }
  15. const p1 = new Point(5, 5);
  16. const p2 = new Point(10,10);
  17. p1.displayName; // undefined
  18. p1.distance; // undefined
  19. console.log(Point.displayName); // "Point"
  20. console.log(Point.distance(p1, p2)); // 7.0710678118654755

属性

实例属性定义在类的方法里,静态或原型的属性定义在类定义的外面

  1. class Rectangle {
  2. constructor(height, width) {
  3. // 实例上的属性
  4. this.height = height;
  5. this.width = width;
  6. }
  7. }
  8. // 静态属性
  9. Rectangle.staticWidth = 20;
  10. // 原型上的属性
  11. Rectangle.prototype.prototypeWidth = 25;

extend

继承
如果子类中定义了构造函数,那么它必须先调用 super() 才能使用 this

  1. class Animal {
  2. constructor(name) {
  3. this.name = name;
  4. }
  5. speak() {
  6. console.log(`${this.name} makes a noise.`);
  7. }
  8. }
  9. class Dog extends Animal {
  10. constructor(name) {
  11. super(name); // 调用超类构造函数并传入name参数
  12. }
  13. speak() {
  14. console.log(`${this.name} barks.`);
  15. }
  16. }
  17. var d = new Dog('Mitzie');
  18. d.speak();// 'Mitzie barks.'

super

用于调用父类上的函数

  1. class Cat {
  2. constructor(name) {
  3. this.name = name;
  4. }
  5. speak() {
  6. console.log(this.name + ' makes a noise.');
  7. }
  8. }
  9. class Lion extends Cat {
  10. speak() {
  11. super.speak();
  12. console.log(this.name + ' roars.');
  13. }
  14. }