0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScriptのclass

Posted at

はじめに

初学者です。
基本は備忘録

classってなに?

よく例えられるのは設計図
class(設計図)からinstance(設計図をもとに作った物)を生成する

JavaScriptにおけるclass

JSにおけるclassはコンストラクター関数をclass表記で書けるようにしたもの
すでにある機能を簡単に書けるようにしたものをシンタックスシュガーという


class

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  hello() {
    console.log('hello ' + this.name);
  }
}

コンストラクター関数

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.hello = function() {
  console.log('hello ' + this.name);
}

classとコンストラクター関数は表記方法は違うが、やっていることは同じ
ES6からclass表記が主流なので基本的にはclassを使う

インスタンスの作り方

new演算子を使ってインスタンスを生成する

class Person {
  constructor(name, age) {
    this.name = name,
    this.age = age
  }
}

const tom = new Person('Tom', 18);

インスタンスってなにがいいの?

コードの量が少ない
メソットはprototypeの参照先をコピーして全てのインスタンスで使い回せるので余計なメモリを消費しない
メソット定義方法

class Person {
  constructor(name, age) {
    this.name = name,
    this.age = age
  }
  
  hello() {
    console.log('hello ' + this.name)
  }
}

コンストラクターと同じスコープに記述する

クラス継承

他のクラスのプロパティーとメソットを継承すること

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  hello() {
    console.log('hello ' + name)
  }
}

//extendsでPersonを継承できる(prototypeも含めて継承する)
class Japanese extends Person {
  constructor(name, age, gender) {
    //引数を固定thisはデフォルトでJApaneseのthisを固定
    super(name, age);
    this.gender = gender;
  }

  hello() {
    console.log('konnichiwa ' + this.name)
  }

  bye() {
    console.log('konnichiwa ' + this.name)
  }
}

const bob = new Japanese('Bob', 18, 'male')
console.log(bob)
//superはclass専用(superがないとエラー)
//superが実行されるとPersonのconstructor
//部分が実行される。その後Japanese専用のプロパティが実行
//prototypeの継承はextendsによって実現されている

super

継承元の関数を呼び出すためのキーワード
superは大抵の場合classのconstructor内で継承元のconstructorを呼び出す際に使われる
制約がある
1つ前のコードのclass Personがある程で書いてます

class Japanese extends Person {
  constructor(name, age, gender) {
  this.gender = gender;
  super(name, age);
  //superの前にthisを参照することはできない。この場合エラーになる
  }
  
  hello() {
    //継承元のメソットを呼び出すこともできる
    //メソットとして呼ぶ場合はthisを先に参照していても問題はない
    super.hello();
    console.log('ハロハロー')
  }
}

おわりに

JavaScriptにおけるclassが内部で何をしているのか知りたい場合はコンストラクター関数を学ぶとわかります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?