- ベストアンサー
用語/newを伴わないコンストラクタの呼出=関数?
- コンストラクタを勉強しているのですが、「用語」「意味」が分からないので、教えてください
- いついかなる時でも、「コンストラクタ関数」=「コンストラクタ」=「関数」=「メソッド」なのでしょうか? 例えば、「newをつけずに、コンストラクタを関数として呼ぶ」場合も、「コンストラクタを実行する」と言うのでしょうか?
- 「new」を付けずに、オブジェクトを関数として実行するのは、例えばどういう使い方をするときなのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
このへんは、一般のオブジェクト指向の概念を無理やりJavaScriptに当てはめようとしたがために混乱を起こしている面があると思います。 コンストラクタ関数と一般に呼びますが、別にそんな特別な関数があるわけじゃありません。ただの関数です。そして、故にオブジェクトです。JavaScriptでは関数もオブジェクトだということは学ばれたと思います。単にオブジェクトを作る用に用意した関数を「コンストラクタ関数」と便宜的に呼んでいるだけです。 関数オブジェクトは、そのまま呼び出せば、そこに書かれた処理が実行されます。ではnewは何か?というと、これはその後にある関数オブジェクトから新しいオブジェクトを生成するためのものです。 newとthisの関係なんて、別にありません。thisは、「現在実行中の処理があるオブジェクトを示す」というだけのものです。メソッドを呼び出すと、そのメソッドはそのオブジェクトの中にあるものですから、オブジェクトがthisとなります。では関数は? 実は、関数というのは、Globalオブジェクト(Callオブジェクトといってるところもあります)のメソッドなのです。関数を定義するというのは、Globalオブジェクトのメソッドを作っているのです。またグローバル変数は、Globalオブジェクトのプロパティです。 なので、関数を呼び出すというのは、「Globalオブジェクトのメソッドを呼び出している」ということなので、Globalがthisになります。ただしGlobalオブジェクトは利用する側からアクセスできないのでそう見えないというだけです。 なので、関数の呼び出しだのnewだのメソッドとの違いだのといったややこしいことは、見かけの問題で、実際に行なっているのは「メソッドを実行する」「newでオブジェクトを作る」これだけです。
その他の回答 (1)
- Gotthold
- ベストアンサー率47% (396/832)
> ■質問2 … 「new」付与による相違 new A() としたときの挙動は 1. 空のオブジェクトを作る。 2. 1のオブジェクトにプロトタイプを設定する。 (具体的には1のオブジェクトの内部プロパティ[[Prototype]]にA.prototypeを代入する。 なお、内部プロパティ[[Prototype]]に直接アクセスする一般的な方法はない。) 3. Aを呼び出す。このときのthisは1.で作ったオブジェクト。 4. (関数を抜けたら)1で作ったオブジェクトを返却する。 ただし、何らかのオブジェクトが関数内でreturnされていたらそちらのオブジェクトを返却する。 となります。 よって、newの有無による違いは、 ・返り値 ・関数内でのthis ・プロトタイプの扱い となります。 > ・「new」付与しないとオブジェクトが正しく生成されないので、不具合が生じる可能性がある? newをつけないときも正しく動作するように作っていないのなら、newを忘れたら普通は期待通りには動かないでしょう。 > ■質問3 > ・「new」を付けずに、オブジェクトを関数として実行するのは、例えばどういう使い方をするときなのでしょうか? 普通の関数はたいていそうだと思いますが。 例えば alert(alert instanceof Function); //true: alertだって関数オブジェクト
お礼
回答ありがとうございましたー
お礼
回答ありがとうございましたー