こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

js コンストラクタ関数 解釈

javascript コンストラクタ関数

jsのコンストラクタ関数と普通の関数の相違点は
「new」を付けて関数を呼ぶかどうかでコンストラクタ関数は初期化しているという解釈は間違っていますか?

投稿日時 - 2017-02-21 10:08:15

QNo.9296389

暇なときに回答ください

質問者が選んだベストアンサー

間違っています。

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のように書いてあるかのように動作させる演算子なのです。

なので「コンストラクタ関数で初期化している」と言う概念は適用できません。

投稿日時 - 2017-02-21 10:46:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

「new」は指定したオブジェクトの prototype 宣言されたプロパティやメソッドをコピーし新たにインスタンスを生成する命令で、関数を呼ぶ命令ではありません。
そして、新たなインスタンスを生成する時に実行されるのがコンストラクタです。
コンストラクタの役割はインスタンスの初期化もありますが、引数で値を渡して一連の処理をさせるメソッドとしても使えるモノですから、初期化だけが役割ではありません。

投稿日時 - 2017-02-21 10:34:23