- ベストアンサー
js コンストラクタ関数 解釈
javascript コンストラクタ関数 jsのコンストラクタ関数と普通の関数の相違点は 「new」を付けて関数を呼ぶかどうかでコンストラクタ関数は初期化しているという解釈は間違っていますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
間違っています。 newを付けても初期化はしません。 例1 function foo(ber, hoge) { this.ber = ber; this.func = function() { console.log(hoge); }; } var hogehoge1 = foo('やあ','こんにちは'); console.log(hogehoge1.ber); //エラー hogehoge1.func(); //エラー var hogehoge2 = new foo('あら','ごきげんよう'); console.log(hogehoge2.ber); //あら hogehoge2.func(); //ごきげんよう 例2 function foo(ber, hoge) { var self = {}; self.ber = ber; self.func = function() { console.log(hoge); }; return self; } var hogehoge1 = foo('やあ','こんにちは'); console.log(hogehoge1.ber); //やあ hogehoge1.func(); //こんにちは var hogehoge2 = new foo('あら','ごきげんよう'); console.log(hogehoge2.ber); //あら hogehoge2.func(); //ごきげんよう 例1のhogehoge1は、newが無いので、関数を直接に呼び出してしまっています。その結果、関数からundefinedが返され、次の2行はエラーになります。 例2のhogehoge1は、newが無くても「newがある時と同じ動作」をします。 つまり、new演算子は、例1のように書いてある関数を、あたかも、例2のように書いてあるかのように動作させる演算子なのです。 なので「コンストラクタ関数で初期化している」と言う概念は適用できません。
その他の回答 (1)
- t_ohta
- ベストアンサー率38% (5246/13724)
「new」は指定したオブジェクトの prototype 宣言されたプロパティやメソッドをコピーし新たにインスタンスを生成する命令で、関数を呼ぶ命令ではありません。 そして、新たなインスタンスを生成する時に実行されるのがコンストラクタです。 コンストラクタの役割はインスタンスの初期化もありますが、引数で値を渡して一連の処理をさせるメソッドとしても使えるモノですから、初期化だけが役割ではありません。