🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

Q&A

解決済

2回答

387閲覧

JavaScript プロパティエラー

maskedrider5556

総合スコア26

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

0グッド

1クリップ

投稿2019/09/20 06:03

JavaScriptのオブジェクトについて質問です。

下記のコードを記述したところ

Uncaught TypeError: Cannot set property 'prop1' of undefined

といったエラー文が出ました。
エラー文の内容として
'定義のされていないprop1にプロパティをセットすることは出来ない'
と解釈してprop1; 'bar'に記述を変更したのですが期待した結果でなくmyFunc {}が返ってきました。

prop1: 'bar'記述の時とthis.prop1 = 'bar'の時ではどのような違いがあるのでしょうか?

どうかご教授ください。

'use strict' const myFunc = function() { this.prop1 = 'bar'; return 'boo'; } const obj1 = new myFunc(); const obj2 = myFunc(); console.log(obj1); // myFunc {prop1: "bar"}を期待 console.log(obj2); // booを期待

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

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

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

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

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

maisumakun

2019/09/20 06:12

「prop1; 'bar'」はどこをどう書き換えたのでしょうか。
guest

回答2

0

ベストアンサー

newをつけずに関数を呼び出した場合、関数内のthisは環境によって「windowなどグローバルオブジェクトになる場合」と「undefinedになる場合」があります。後者だった場合、undefinedのプロパティは参照できず、エラーとなります。

なお、newの有無で関数の動作を変えたい場合、this instanceof myFuncのような方法でチェックするのが確実です。


(追記)

console.log(obj1)の出力がmyFunc {prop1: "bar"}にする場合はどのような記述になるのでしょうか?

上に書いたように、instanceofで振り分けられます。

javascript

1function myFunc() { 2 if(!(this instanceof myFunc)) return 'boo'; 3 this.prop1 = 'bar'; 4} 5 6const obj1 = new myFunc(); 7const obj2 = myFunc();

投稿2019/09/20 06:16

編集2019/09/20 07:15
maisumakun

総合スコア145975

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

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

maisumakun

2019/09/20 06:18

もっとも、いまどきのJavaScriptとしては、newするものはclassとして作るのが主流になっています。既存のコードとの兼ね合いがあるのでなければ、newして使う前提の関数を新たに作らないほうがいいでしょう。
maskedrider5556

2019/09/20 07:14

ご回答いただきありがとうございました。 JavaScriptでもclass構文が使えるようになっているようなのでそちらを使用するようにします。
maskedrider5556

2019/09/20 07:37

追記でのご回答もありがとうございます。 thisの挙動や知らないメソッドがまだまだあるなと痛感しましたので、引き続き学習を続けます。
guest

0

new演算子の働きは以下のとおりです。(4が微妙に間違っていると思いますが)

  1. 空の JavaScript オブジェクトを生成する
  2. このオブジェクト (のコンストラクター) を他のオブジェクトへリンクする
  3. ステップ 1 で新しく生成されたオブジェクトを this コンテキストとして渡す
  4. 関数が自分自身を返さない場合は this を返す

new 演算子 - JavaScript | MDN


なので、

js

1const myFunc = function() { 2 this.prop1 = 'bar'; 3 return 'boo'; 4}

について、

  • new付きで呼び出すと、空のオブジェクトがthisに入り、空のオブジェクトにprop1というプロパティが生え、返ってきます。
  • newなしで呼び出すと、thisundefinedなので、エラーになります。

js

1const myFunc = function() { 2 prop1: 'bar'; 3 return 'boo'; 4}

について、prop1: 'bar';ラベルつき文と解釈されますから、ただの文字列と評価され、結果的に何も起きません。

  • new付きで呼び出すと、空のオブジェクトがthisに入り、何も起きずそのまま空のオブジェクトが返ってきます。
  • newなしで呼び出すと、何も起きず'boo'が返ってきます。

コメントを受けて追記

new.targetを使うといいと思います。

js

1const myFunc = function() { 2 if (new.target) this.prop1 = 'bar'; 3 return 'boo'; 4}

new.target プロパティは、関数やコンストラクタが new 演算子を使用して呼び出されたかどうかを検出できるようにします。

new.target - JavaScript | MDN

ただ、よく見ると、IEは非対応のようですね……

投稿2019/09/20 06:41

編集2019/09/20 07:26
Lhankor_Mhy

総合スコア36946

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

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

maskedrider5556

2019/09/20 07:12

ご回答いただきありがとうございます。 console.log(obj1)の出力がmyFunc {prop1: "bar"}にする場合はどのような記述になるのでしょうか? 貼って頂いたMDNの記事を基に修正したのですがうまく行きませんでした。 ``` function myFunc(name) { this.prop1 = name; } var obj1 = new myFunc('yamada'); ```
Lhankor_Mhy

2019/09/20 07:20

new.target を使うといいと思います。 追記します。
Lhankor_Mhy

2019/09/20 07:25

間違えました。直します。
maskedrider5556

2019/09/20 07:35

追記でのご回答もいただき誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問