こんにちは!りょた(@Ryo54388667)といいます(^o^)
クラスのconstructorを直感的に理解できるように説明していきます。
- クラスを勉強したけど、意味がわからない。
- constructorの意味がわからない。
- constructorをイメージでとらえたい。
クラスのconstructorの理解の助けになれば嬉しいです。
1 クラスをイメージでとらえよう!
クラスを初めて学習したときは、おそらくモノに例えてイメージしたのではないのでしょうか。
この記事のなかでも、クラスをイメージでとらえていきます。
今回は、自動車で例えていきます。
一言で言えばクラスとは
何かモノをつくるときの「設計書」のようなものです。

プログラム上のクラスと現実世界の設計書の関係はこのようなものです。

しかし、クラスには設計書に無い「constructor」という部分があります。

「これは何ですか・・・?」
そう思った人も多いのではないのでしょうか。この部分がなかなか理解しがたいと思います。
僕も完全に理解したわけではありませんが、僕の知識の限り理解の助けになるかもしれない要素を次のセクションで書いていきます。
2 constructorの理解を助ける3項目
① constructorは特別な関数のようなもの
試しにconstructorについてググってみます。
このような説明が書かれていました。
constructor メソッドは、 classで作成されたオブジェクトの生成と初期化のための特殊なメソッドです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/constructor
これで理解できた人はこの記事を見なくて大丈夫です^^;)
僕はこの説明の意味が全然わかりませんでした。
「イメージができないんだよ。。。」
そう思われた人も多いと思います。
詳しく説明していきます。
constructorの役割のひとつとして、設計書をもとにモノを作った際に得られる情報が初めにわたってくるところです。
イメージとしてはこのような感じです。

クラス名の部分がconstructorに変わっているような感じで読み替えるとわかりやすいと思います。
モノをつくるときに、始めに情報がわたってくる部分なんだな、と理解してみてください!
② フィールド変数の要素で宣言したものとは異なる

「始めに情報がわたる部分ということはわかった。でも、constructorの上の部分にかかれていることと同じものが書かれているやん。」
ここがややこしいポイントですね!
結論としては、①と②は異なるものを表しています。
「じゃあなんで同じような名前にしているの?まぎらわしい。。。」
そう感じる人もいるのではないかと思います。
じつは、constructorの処理が終わったあとは、ほとんど同じようなものとして扱うようになります。
そうなる以上、「どうせ同じものになるのだから、わかりやすく同じような名前でいいよね。」
という慣習があり、こんなふうに書きます。
この部分が親切なのか、逆に複雑にしているのか意見のわかれる部分だと思います。
今のところの理解としては、
設計書の上部にかかれている情報とモノを作ったときに得られる情報は異なるものだというふうに理解してください。
③ 紐付け作業に近い役割
「同じものじゃないのはわかったけど、結局constructorは何をしているんだ。。。」
そう思うのも無理はありません。
②でも言いましたが、最終的には設計書の上部にかかれている情報とモノを作ったときに得られる情報を同じものとして扱うようになります。
その作業をconstructorで行っています。
ようは、「同じものとして扱えるようにする」というのがconstructorの役割です!
これがいわゆる初期化という作業です。イメージは下のようなものです。
まず、クラス名(Car)の代わりにconstructorが作動し、引数を渡します。

そして、引数「プリウス」は右辺のnameに渡り、左辺のthis.nameに格納されます。

コンピュータ側からみると、クラスの上部の情報と、モノが作られたときに得られる情報との関係がわかっていません。だから、既存の箱に入れてあげることで、それらの関係が同じものだよと、紐付けてあげるのがconstructorの役割です。
「=」のプログラム上の意味は、代入を表すのですが、このconstructorに関しては日本語の等号として理解するほうが、スッキリするかもしれません。
3 最後に
ここまでまとめると、
constructorというのは、設計書をもとにモノが作られたときの情報が始めにやってきて、それらと、設計書の上部に書かれた情報との関係が同じモノだよ、と紐付けてあげてあげるもの。
ということです。
いかがでしょうか。厳密にいうと中身の処理は違うかもしれませんが、直感的な理解はこのような感じになります。
constructorの理解に役立てれば幸いです。
最後まで読んでくださり、ありがとうございました!
未経験からエンジニアに転職するまでにやってきたことについては下の記事にすべて書きました。
あわせて見てみてください(^^)