質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

2066閲覧

JavaScript】コンストラクタの概念が分かりません

ayaChi

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/05/31 06:00

学習し始めて2週間たち、
JavaScriptに出てくる言葉の概念を
一度整理したいのですが、
JavaScriptの[コンストラクタ]の概念が
ちゃんと理解できません。

普通の関数と、コンストラクタ関数の違いはなんなのでしょうか。調べると、newするときに初期化するものをコンストラクタというと書いてありましたが、ピンときませんでした。

平易な言葉で説明していただけませんか。
よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

以下はJavaScriptだけの話です。

ES6の世界では覚えなくていいものだと思いますが、コンストラクタ自体はただの関数です。

js

1function c(){ 2 this.p = 1; 3} 4c(); 5 6//undefiend

new演算子をつけて呼び出すことによって、新たなオブジェクトを返します。

js

1function c(){ 2 this.p = 1; 3} 4new c(); 5 6/* 7{p:1} 8*/

この時、new演算子によって起こっていることは、以下のとおりです。

  1. 新たなオブジェクトを作成しthisに入れる。
  2. c()を実行する。
  3. return文があれば戻り値を返し、なければthisを返す。

(簡単のため[[prototype]]などについては省略)

以上、ひとことでまとめると、「new演算子をつけて呼び出すことを意図して書かれた関数をコンストラクタと呼ぶ」という理解でいいかと思います。

投稿2019/05/31 06:47

編集2019/05/31 06:52
Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayaChi

2019/05/31 12:25

まとめがすごく分かりやすかったです。概念を理解することができました。貴重なお時間とって教えていただき、ありがとうございます!
guest

0

ベストアンサー

コンストラクター関数

コンストラクターとは、正確にはコンストラクター関数であり、現実で例えると、工場の製造機のようなものです。

例えば、ナイキの靴の製造機を想像して下さい。エアーマックスという種類の靴を製造してくれる機械があったとします。その製造機はいくつも同じエアーマックスを製造してくれます。

この製造機・製造物(靴:エアーマックス)のモデルを、コードで表したのがコンストラクター関数です。
製造機の例とコードを対比したものが以下です。

現実プログラミング
製造機コンストラクター関数
[製造][具現化]
物体(オブジェクト)

js

1"use strict"; 2 3/* console.logと毎回書くのは面倒&見づらいゆえ、`_`(アンダースコア)に割り当て */ 4let _ = console.log; 5 6function AirMax(){ 7 this.brand = "Nike"; 8 this.shoesType = "Air Max"; 9}; 10 11let airMax1 = new AirMax(), 12airMax2 = new AirMax(); 13 14_( airMax1.brand ); //-> "Nike" 15_( airMax1.shoesType ); //-> "Air Max" 16 17_( airMax2.brand ); //-> "Nike" 18_( airMax2.shoesType ); //-> "Air Max"

コンストラクター関数は、その前にnewキーワードを書くと、物体を作成し返却します。上記コードでは、新たに作成された物体をairMax1, airMax2に割り当て、後で参照出来るようにしています。

new + コンストラクター関数 によって物体を作成する事を、プログミングでは具現化すると言い、作成された物体airMax1/airMax2具現物と言います。

新しく具現化され返却された物体は、コンストラクター関数内で定義された性質・術が初期値化されています。

少しだけ違うものを具現化する

先の例では、具現物が全く同じものばかりになってしまいます。

そこで、少し違うものを作りたい場合、例えば先の靴の例で言えば「靴に買った人の名前を入れる」事にします。そういう場合は、具現化時に、コンストラクター関数に引数として名前を渡せるように、コンストラクター関数を少し変更します。

js

1function AirMax(name){ 2 this.brand = "Nike"; 3 this.shoesType = "Air Max"; 4 5 /* 追加 */ 6 this.owner = name; 7}; 8 9let airMax1 = new AirMax("Taro"), 10airMax2 = new AirMax("Hana"); 11 12_( airMax1.owner ); //-> "Taro" 13_( airMax2.owner ); //-> "Hana" 14

まとめ

上記の靴は、分かりやすい現実の例で例えました。既知かもですが、プログミングでは、物理的なものだけに限らず、あらゆるの物事を物体(オブジェクト)で表すことが出来ます。

用語

(カタカナ用語は分かりにくいので、日本語にして説明しました)

私訳既存訳
組み立て係コンストラクター(constructor)
物体オブジェクト(object)
具現化するインスタンシエイト(instantiate)
具現物インスタンス(instance)
初期値化する初期化する(initialize)
性質プロパティ(property)
メソッド(method)

追記[19.06.04]

普通の関数と、コンストラクタ関数の違いはなんなのでしょうか。

という部分に答えていなかった事に気付き????、 以下まとめてみました。もし参考になれば幸いです????(新たな独自用語がて出てきて分からない場合は、上の用語を参照下さい。追記しておきましたゆえ(。•ㅅ•。))

上記の回答部分に一文追記しました。重要部分&追記明瞭化のため、一文が太字になっています。

通常の関数とコンストラクタ関数との違い

通常関数とコンストラクタの違いを、表にして比較してみました。

通常関数コンストラクタ
❶目的繰り返し行う作業をまとめ、作業の効率化。複数回記入→誤記入→エラー の削減のため同じような性質・術を備えた、複数の物体を作成するため
{}内の定義の仕方様々な処理を定義するthis.性質名 = 値 or this.術名 = function(){}
❸呼び出し識別子名 + ()new + 識別子名
❹返却値returnの有無による新しく作成された物体。コンストラクタで定義された性質・術が初期値化されている

どちらも関数ですが、全くの別物と考えると分かりやすかと思います。元々、通常の関数(以下、通常関数)とコンストラクタ関数は、使用目的も呼び出し方も全く異なります。

僕も最初はそうでしたが、ややこしい・わかった様な分からない様な…と感じる理由は

  • どちらもfunctionを使って定義されいる(関数である)
  • 定義が抽象的

だからが大きい気がします。ですので、以下に分かりやすよう、コンストラクタ関数をfunctionキーワードを用ず書き直してみました。

通常関数

js

1function greetingTo( val ){ 2 console.log("おはよう、"+ val); 3}; 4 5greetingTo("悟空"); // "おはよう、悟空"

コンストラクタ関数

js

1CONSTRUCTOR AirMax(){ 2 this.brand = "Nike"; 3 this.shoesType = "Air Max"; 4}; 5 6new AirMax(); // 比較が分かりやすいよう、返却された具現物の割り当てはしていません

こうすると、通常関数とコンストラクタでは、{}内の定義の仕方・呼び出し方の違いがより分かりやすいかと思います。

投稿2019/05/31 11:43

編集2019/06/06 02:40
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayaChi

2019/05/31 12:31

分かりやすい現実のことで例えてくださって助かりました!とても理解しやすかったです。コンストラクタは製造機なんですね。 同じ靴を複製していって、違うデータ(所有者の名前)を入れたくなったら、引数で値を渡せばいいんですね。で、newするときに、新しく生成されるインスタンスに所有者の名前を渡してあげることで、微妙に違う靴の大量生産ができるということなんですかね! 貴重なお時間をとって教えて下さってありがとうございます!
退会済みユーザー

退会済みユーザー

2019/05/31 13:44 編集

そうですそうです( ´ω`)/✨♪♪ 分かりやすいようで良かったです( ´ω`)/✨♪♪ こちらも凄く勉強になりました*.(๓´͈ ˘ `͈๓).*???? コンストラクター関数の様に、「設計図」的な手法で物体(オブジェクト)を作る方法は、他に ❷"クラス(部類)" を使うやり方もあります。 また、JavaScripの場合は、物体を具現化によって、または、字母**`{}`によって作成した後に、他の物体の性質**や術**を"継承**"する事ができたりします(原型**) ).(๓´͈ ˘ `͈๓).*???? **語彙** 字母: リテラル(literal) 性質 :プロパティ(property) 術: メソッド(method) 継承: __(inheritance) 原型: プロトタイプ(prototype)
guest

0

オブジェクト指向言語には大体ある概念ですので下記のような記事をまず読んでみましょう。

冒頭から引用

・メソッド(関数)だよ

・クラスをnewしたときに実行されるよ
・オブジェクト指向なプログラミング言語で出てくるよ

「クラスをnewしたときに自動で実行されるメソッド」というのが簡単な説明ですね。

下記の記事にあるサンプルコードが分かりやすいと思います。

記事から引用

js

1function Person(n) { // Constructor 2 this.name = n; 3 return this; // opt. 4} 5 6var p1 = new Person('Hanako'); 7document.write(p1.name);

自動で「Hanako」というnameを持ったPersonオブジェクトができあがるわけです。
ということで、newのときに別の引数を渡してあげると、いろんな人の情報を持つそれぞれのPersonオブジェクトができあがります。

js

1function Person(n) { // Constructor 2 this.name = n; 3 return this; // opt. 4} 5 6let PHanako = new Person('Hanako'); 7let PTaro = new Person('Taro'); 8let PAi = new Person('Ai'); 9let PKenji = new Person('Kenji'); 10 11console.log(PHanako.name); 12console.log(PTaro.name); 13console.log(PAi.name); 14console.log(PKenji.name);

投稿2019/05/31 06:21

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayaChi

2019/05/31 12:23

コンストラクタ関数の概念と書き方、参考になりました、貴重なお時間とって教えてくださり、ありがとうございます!
m.ts10806

2019/05/31 12:30

参考になったようで何よりです
guest

0

学習し始めて2週間たち、
JavaScriptに出てくる言葉の概念を

この状況でしたら「コンストラクタ」の理解はスキップした方がよいかも。

オブジェクト指向にはクラスペースとプロトタイプベースがありまして、
JavaScript は後者に分類されます。
また、前者の特徴としてクラスを定義するってのがありまして、
その中でコンストラクタも定義するのでわかりやすいと思います。

世の中の(有名なオブジェクト指向)プログラミング言語では
前者が多いので Java なり Python なりを勉強しはじめてから
コンストラクタを理解するのがいいんじゃないかなあ、と。

投稿2019/05/31 12:18

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問