takumi19910112
@takumi19910112 (やま)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaScriptのコンストラクタについて

解決したいこと

JavaScriptのコンストラクタについて教えてです。
JavaScriptについて調べているとらコンストラクタとは定義した『クラスからオブジェクトを生成し、初期化する際に実行される特殊な初期化用メソッド』と書いてあったのですが、具体的なイメージが持てません。
例えば

const hogeclass = class {
  constructor(x, y) { /* コンストラクタ */
    this.x = x
    this.y = y
  }
}

と書くのと、

const hogeclass = class {
   let x = x
     let y =y
  }
}

では、意味が全く違う、または下のコードは書き方そのものが間違っているのでしょうか?
また、関連してinit関数は、DOMを初期化してイベントハンドラをつける、という説明もありましたが、合わせて教えて頂きたいです。

0

1Answer

不自然な日本語ですみません
できるだけシンプルなイメージで説明をします

クラスはオブジェクトを作成するためのテンプレートです
constructorはクラスのプロパティ(変数や定数)を定義する場所です
人間のクラスを作りたい場合は、人間の国籍、身長などconstructorで定義できます。国籍、身長は人間のプロパティですね

const people = class {
	constructor(nationality, height) {
		this.nationality = nationality;
		this.height = height;
	}
};

上記のコードで人間のクラス、人間というオブジェクトのテンプレートpeopleを作りましたので、次は具体的な人を作りましょう

私は中国人で身長180
あなたは日本人で身長185
どうやって一つのクラスで国籍、身長が全然違う二人を作るか
これはconstructorのパラメータに具体的な国籍と身長を入力することで作れます

定義の時に:
constructor(nationality, height){...}
new(初期化/インスタンス/具体的な人をつくる)の時に:
const person = new people(nationality(具体的な国籍), height(具体的な身長))
定義する時はconstructorで定義、初期化する時はクラスで使います

考えると、constructorがなければ、具体的な値(中国、日本など)が入力できません、constructorのパラメータはある意味でクラスのプロパティを変更する値の入り口のイメージです

const chinese = new people("中国",180)
console.log(chinese.nationality) // "中国"
console.log(chinese.height) // 180

const japanese = new people("日本",185)
console.log(japanese.nationality) // "日本"
console.log(japanese.height) // 185

質問を回答してみます

const hogeclass = class {
  let x = x
  let y = y
}

上記の書き方はエラーを起こすみたいです
まず定義したxの値のxはどこからでしょうね、この書き方は入り口がないです。
国籍、身長が全然違う二人を作りたい場合は、具体的な値(中国、日本など)をクラスに渡すことができません。(この書き方で定義した変数はクラス外部からアクセスできません、これは別の話…)

クラスの概念は色々ありますが、単純なconstructorについての説明は以上です。

メソッドだけのクラス:

class person {
	talk(){
		console.log("hello")
	}
}

let tanaka = new person()

tanaka.talk() // "hello"

1Like

Comments

  1. @takumi19910112

    Questioner

    @kensoz さん
    回答ありがとうございます。
    人間というクラスがあり、国籍や身長をconstructor内で定義し、インスタンスを生成したときに引数として具体的な国名や身長を渡す、という理解であっていますでしょうか?
    また、ということはconstructorがなければクラスだけつくっても何もできず、JavaScriptにおいては必ず constructorを書かないといけないのでしょうか?
  2. ごコメントありがとうございます

    > 人間というクラスがあり、国籍や身長をconstructor内で定義し、インスタンスを生成し> たときに引数として具体的な国名や身長を渡す
    この理解はあっています!

    > constructorがなければクラスだけつくっても何もできず
    シーンによってconstructorがないクラスをつくる場合はあります
    constructorはプロパティを定義する場所で、クラスはconstructor(プロパティ)だけでなく、メソッド(行為)も定義できます。例えば人間は、「話す」「走る」というメソッド(行為)があって、クラスで定義できます、このようなのクラスを使う時は「話す」というプロパティと関係ないメソッドとして使えます。

    > JavaScriptにおいては必ず constructorを書かないといけないのでしょうか?
    classというクラスのキーワードを書くと、JavaScriptは自動的にそのクラスのconstructorを作成するという仕組みです。メソッドだけのクラスはconstructorをかかなくても大丈夫です!

  3. @takumi19910112

    Questioner

    constructorがあることでclassの初期値を設定でき、かつオブジェクトを生成したときに引数として渡すことができるということがわかりました。
    また、必ずしもconstructorを書く必要はなく、class内にメソッドのみ書いてもよいことがわかりました。丁寧な解説ありがとうございます。
    教えてくださった内容をもとに、自分なりにまとめた記事を作成しました。
    拙い内容ですが、目を通していただけますと幸いです。
    https://qiita.com/takumi19910112/items/9755ab4b3981ad67d8b5

Your answer might help someone💌