クラスのメソッドにはアロー関数を定義することができないのですか?

クラス内のメソッドにアロー関数を定義することはできません。
2022年2月11日
ユーザー

クラスのメソッドをこのようにアロー関数にして書きたかったのですが、

class Book {
  constructor(title, author) {
    this.title = title;
    this.author = author;
  }

  introduction = () => {
    console.log(`タイトル: ${this.title}、著者: ${this.author}`);
  };
}

class Manga extends Book {
  constructor(title, author, month) {
    super(title, author);
    this.month = month;
  }

  introduction = () => {
    super.introduction();
    console.log(`${this.month}月号です。`);
  };
}

const book = new Book("普通の本", "普通の人");
book.introduction();

const abc = new Manga("ABCコミック", "田中太郎", 5);
abc.introduction();

実行してみると

タイトル: 普通の本、著者: 普通の人
test.js:19 Uncaught TypeError: (intermediate value).introduction is not a function
    at Manga.introduction (test.js:19:11)
    at test.js:28:5

Book クラスの方は思ったとおりに動くのですが、
それを継承した Manga クラスの方では動いてくれませんでした。
クラスのメソッドにはアロー関数は使わない方がいいのでしょうか?
また、このように親の Book クラスの方だけ書き方を変えたら、

class Book {
  constructor(title, author) {
    this.title = title;
    this.author = author;
  }

  // ここだけ変更
  introduction() {
    console.log(`タイトル: ${this.title}、著者: ${this.author}`);
  }
}

class Manga extends Book {
  constructor(title, author, month) {
    super(title, author);
    this.month = month;
  }

  introduction = () => {
    super.introduction();
    console.log(`${this.month}月号です。`);
  };
}

const book = new Book("普通の本", "普通の人");
book.introduction();

const abc = new Manga("ABCコミック", "田中太郎", 5);
abc.introduction();

このように動きました。

test.js:9 タイトル: 普通の本、著者: 普通の人
test.js:9 タイトル: ABCコミック、著者: 田中太郎
test.js:21 5月号です。

この差は一体何なのでしょうか。教えていただきたいです。

この回答を見るにはプレミアムプランへの登録が必要です

プレミアムプランとは?

このレッスンの質問と回答(15)