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

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

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

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

Q&A

解決済

3回答

1638閲覧

オブジェクトが生成されない理由が分かりません

newyee

総合スコア213

JavaScript

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

0グッド

4クリップ

投稿2018/09/07 03:27

編集2018/09/07 03:28

javascriptを勉強中のものなのですが、以下のコードで分からない部分があった為質問させていただきました。

javascript

1var Member = function(firstName, lastName){ 2 this.firstName = firstName; 3 this.lastName = lastName; 4 5 }; 6 var m = Member('権兵衛','佐藤'); 7 console.log(m); //結果:undefined 8 console.log(firstName); //結果:権兵衛 9 console.log(m.firstName); //結果: エラー(Cannot read property 'firstName' of undefined)

上記のコードの説明としまして、「Memberオブジェクトは生成されず、代わりにグローバル変数としてfirstName/lastNameが生成されてしまうのです。(thisがグローバルオブジェクトを示すからです。)」
とあったのですが、Memberオブジェクトが生成されないということは、「 var m = Member('権兵衛','佐藤');」ここの部分でnew演算子を用いてインスタンス化できていないから、ということなのでしょうか?
また、「代わりにグローバル変数としてfirstName/lastNameが生成されてしまう、(thisがグローバルオブジェクトを示すからです。)」ここの部分につきましても、thisがグローバルオブジェクトを示す=グローバル変数として、firstName/lastNameが生成されるのが何故なのかも分からないです。
どなたか教えてくださる方いらっしゃいましたら、ご解説お願いいたします。

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

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

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

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

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

guest

回答3

0

new してるかどうかが問題かな?と予想したんですよね?比較してみましたか?
予想ができたのなら試してみましょう。

  • Memberの中に、console.log(this);を仕込んでみたら何が出てきますか?
  • var m = new Member('権兵衛', '佐藤');と、newを付けてみたらthisはどうなりますか?

thisの正体がわかれば、なぜそうなるのかもわかると思いますよ。
せっかく予想までできているのですから、自分で試さないのはもったいないです。

投稿2018/09/07 03:36

spookybird

総合スコア1803

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

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

newyee

2018/09/07 08:30 編集

ご回答ありがとうございます。 予想をしていたのなら試さないとダメですよね。 ご指摘頂いた通り、console.log(this)で試してみましたら、インスタンス化されていないことが分かりました。 次回からは、もう少し自分で色々試してからご質問させていただこうと思います
guest

0

ベストアンサー

new しなければMember関数を実行するだけですから
thisがかえすのはwindow
windowのfirstNameプロパティを設定しているのだから
グローバル変数が設定されています

javascript

1var Member = function(firstName, lastName){ 2 this.firstName = firstName; 3 this.lastName = lastName; 4 console.log(this); 5}; 6var m1 = Member('権兵衛','佐藤'); 7var m2 = new Member('権兵衛','佐藤');

投稿2018/09/07 03:32

yambejp

総合スコア114814

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

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

newyee

2018/09/07 05:21

ご回答ありがとうございます。 ご回答下さった部分の中でお聞きしたい所があるのですが、「windowのfirstNameプロパティを設定しているのだからグローバル変数が設定されています」ここの部分なのですが、「var m1 = Member('権兵衛','佐藤');」ここを実行した際と、トップレベルで「var firstName = '権兵衛'」「var lastName = '佐藤'」を宣言するのと同じ意味になるということでしょうか?
yambejp

2018/09/07 05:25

そうですね var firstName="花子"; var Member = function(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; }; var m1 = Member('権兵衛','佐藤'); console.log(firstName);
newyee

2018/09/07 08:23

ありがとうございます。 関数の中で宣言した値がグローバル変数となることに違和感があり、少し混乱していた部分があったのですが、なんとか理解することができました!
guest

0

Javascriptの関数は呼び出し方によって4つに分類されます。

・関数呼び出し
・メソッド呼び出し
・コンストラクタ呼び出し
・call,apply呼び出し

それぞれ呼び出し方で違うのは関数ブロック内のthisの参照先です。

今回の例の場合、呼び出し方は「関数呼び出し」になります。「関数名()の形で呼び出す」
その場合関数ブロック内のthiswindowオブジェクトを参照します。

newを付けて呼び出した場合は「コンストラクタ呼び出し」となります。「new 関数名()の形で呼び出す」
thisの参照先は「prototypeに元の関数への参照をもった新しいオブジェクト」になります。
簡単に言えばnewをつけて呼び出した関数オブジェクトのインスタンスです。

投稿2018/09/07 05:57

編集2018/09/07 05:59
keisukeh

総合スコア657

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

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

newyee

2018/09/07 08:35

ご回答ありがとうございます。 他のご回答者様のご回答と併せて、理解する助けとなり感謝しております。 勉強不足を痛感しましたので、もっと勉強頑張っていきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問