学習し始めて2週間たち、
JavaScriptに出てくる言葉の概念を
一度整理したいのですが、
JavaScriptの[コンストラクタ]の概念が
ちゃんと理解できません。
普通の関数と、コンストラクタ関数の違いはなんなのでしょうか。調べると、newするときに初期化するものをコンストラクタというと書いてありましたが、ピンときませんでした。
平易な言葉で説明していただけませんか。
よろしくおねがいいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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
演算子によって起こっていることは、以下のとおりです。
- 新たなオブジェクトを作成し
this
に入れる。 - c()を実行する。
return
文があれば戻り値を返し、なければthis
を返す。
(簡単のため[[prototype]]
などについては省略)
以上、ひとことでまとめると、「new
演算子をつけて呼び出すことを意図して書かれた関数をコンストラクタと呼ぶ」という理解でいいかと思います。
投稿2019/05/31 06:47
編集2019/05/31 06:52総合スコア37413
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/05/31 13:44 編集

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
総合スコア80888
0
学習し始めて2週間たち、
JavaScriptに出てくる言葉の概念を
この状況でしたら「コンストラクタ」の理解はスキップした方がよいかも。
オブジェクト指向にはクラスペースとプロトタイプベースがありまして、
JavaScript は後者に分類されます。
また、前者の特徴としてクラスを定義するってのがありまして、
その中でコンストラクタも定義するのでわかりやすいと思います。
世の中の(有名なオブジェクト指向)プログラミング言語では
前者が多いので Java なり Python なりを勉強しはじめてから
コンストラクタを理解するのがいいんじゃないかなあ、と。
投稿2019/05/31 12:18
総合スコア7468
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/31 12:25