构造器和方法

constructor和methods是类的基本组成要素

  1. class Person {
  2. constructor(name, age) {
  3. // 构造器中的this指向 - 类的实例对象
  4. this.name = name
  5. this.age = age
  6. }
  7. // 一般方法
  8. speak() {
  9. // speak方法放在原型对象上,供实例使用
  10. console.log(`我叫${this.name},我年龄${this.age}`)
  11. }
  12. }

构造器constructor方法是在用类new实例时调用的,作用是初始化一个实例对象;
speak方法是挂载在类的原型上的(Person.prototype);当用实例.speak()调用方法时,会顺着原型链来找这个speak方法,所以该方法是专门给实例对象来调用的。

继承

顺着上面的Person类,我们想再创建一个Student类

  1. class Student extends Person {
  2. constructor(name, age, grade) {
  3. super(name, age)
  4. this.grade = grade
  5. }
  6. }

在继承时,如果子类写了构造器,就必须调用super方法,来执行父类的构造器方法;且该方法必须放在开头的位置,否则出现以下报错。
image.png

类中赋值语句

类中是可以直接写赋值语句

  1. class Student extends Person {
  2. constructor(name, age, grade) {
  3. super(name, age)
  4. this.grade = grade
  5. }
  6. doExam = true
  7. doHomework = true
  8. }

类中不加static的赋值语句,最终都会直接挂载到实例对象上
image.png

静态方法

1.静态方法直接通过类名调用

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来直接调用,这就称为“静态方法”。

  1. class Person{
  2. sayAge(){
  3. console.log(18)
  4. }
  5. static sayName(){
  6. console.log("hello")
  7. }
  8. }
  9. var p = new Person();
  10. p.sayName(); // 报错:p.sayName is not a function
  11. Person.sayName();//hello

上面代码中,Person的sayName方法由static关键字,表示该方法是一个静态方法,可以直接在Person类上调用(Person.sayName()),而不能在Person的实例上调用。

2.静态方法中不能调用非静态方法

  1. class Person{
  2. sayAge(){
  3. console.log(18)
  4. }
  5. static sayName(){
  6. this.sayAge(); //报错:this.sayAge() is not a function
  7. console.log("hello")
  8. }
  9. }

静态方法内只能调用静态的方法

3.静态方法可以被继承

  1. class Foo {
  2. static classMethod() {
  3. return 'hello';
  4. }
  5. }
  6. class Bar extends Foo {
  7. }
  8. Bar.classMethod() // 'hello'

上面代码中,父类Foo有一个静态方法,子类Bar可以调用这个方法。
静态方法也是可以从super对象上调用的。

  1. class Foo {
  2. static classMethod() {
  3. return 'hello';
  4. }
  5. }
  6. class Bar extends Foo {
  7. static classMethod() {
  8. return super.classMethod() + ', too';
  9. }
  10. }
  11. Bar.classMethod() // "hello, too"