创建一个类

  1. class Person {
  2. // 静态属性
  3. static staticName = "这是一个静态属性";
  4. // 实例属性,只能通过实例访问
  5. age = '18';
  6. // 接受实例的参数,this指向当前类的实例
  7. constructor(name) {
  8. this.name = name;
  9. }
  10. // 方法在该类的原型上面,所有由该类所产生的实例都可以访问 通过原型链查找
  11. sayName () {
  12. console.log('实例方法1:', this.name);
  13. }
  14. // 相当于以属性的方式来定义方法,只能通过实例访问
  15. sayName2 = () => {
  16. console.log('实例方法2:', this.name);
  17. }
  18. }
  19. const a = new Person('张三');
  20. console.log(a.staticName); // undefined
  21. console.log(Person.staticName); // 这是一个静态属性
  22. console.log(a.name); // 张三
  23. a.sayName(); // 实例方法1: 张三
  24. Person.prototype.sayName() // 实例方法1: undefined
  25. a.sayName2(); // 实例方法2: 张三
  26. Person.sayName2() // Person.sayName2 is not a function
  27. const b = new Person('李四');
  28. b.sayName() // 实例方法1: 李四
  • this

    • 明白这个this的明确含义
    • 哪个实例调用。this就指向它
      • 注意这个this 如果使用了.call 指定的化就不是实例本身了

        继承

        ```javascript class Person { // 静态属性 static staticName = “这是一个静态属性”; // 实例属性,只能通过实例访问 age = ‘18’; // 接受实例的参数,this指向当前类的实例 constructor(name) { this.name = name; }

    // 方法在该类的原型上面,所有由该类所产生的实例都可以访问 通过原型链查找 sayName () { console.log(‘实例方法1:’, this.name); } // 相当于以属性的方式来定义方法,只能通过实例访问 sayName2 = () => { console.log(‘实例方法2:’, this.name); } }

// 继承Person类 class Student extends Person { // 子类自己的属性,会替代父类的同名属性 name = ‘zs’ constructor(name) { // super()调用父类的构造函数 此时的this指向子类 super(name); } } const student = new Student(‘王五’); console.log(student.name); // zs student.sayName(); // 实例方法1: zs student.sayName2(); // 实例方法2: zs ```

总结

  1. 类中的构造器不是必须要写的,要对实例进行一些初始化的操作,如添加指定属性时才写。
  2. 继承的时候,如果不写constructor构造函数,则会在内部自动调用,但是如果写了,则必须调用super方 法, 否则会报错。且父类中constructor的形参,也要写上
  3. 类中所定义的方法,都放在了类的原型对象上,供实例去使用。