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

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

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

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

Q&A

解決済

3回答

1312閲覧

Aオブジェクト内に定義したBオブジェクトのインスタンスの中身がなくなる

okashi123

総合スコア43

JavaScript

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

0グッド

0クリップ

投稿2017/03/23 14:16

編集2017/03/24 02:00

webページを作っていてタイトルの現象が起きているのですが原因がわかりません。
きっかけ程度でもいいので情報がほしいです。

画面起動時とUI操作時に動作していて起動時は動いているのですがUI操作で呼び出すと「Cannot read property 'test' of undefined」が発生します

だいたい以下のような感じの処理なのですが何かご存じの方はおられますでしょうか

(2017/03/24 10:59 修正)

var A = function(objB) { this.objB = objB; } A.prototype.hoge = function() { this.objB.test(); } var B = function() {} B.prototype.test= function() { //処理 }
var a; var b; $(document).ready(function() { b = new B(); a = new A(b); })

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

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

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

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

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

guest

回答3

0

ベストアンサー

thisが違う物を指すのが原因です。
サンプル
何らかの方法でthisを束縛するか、クロージャを使うのがいいと思います。

参考:
クラスメソッドをthisを使用してイベントハンドらに追加 - hogehoge foobar Blog Style5
ES6 で this が変わらないメソッド - Qiita

投稿2017/03/24 02:35

Lhankor_Mhy

総合スコア36074

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

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

0

元のコードと実証用コードがかなり違うと想像しますが、objB.test();this.objB.test(); では?

JavaScript

1var A = function(objB) { 2 this.objB = objB; 3} 4 5A.prototype.hoge = function() { 6// objB.test(); // ここ 7// ↓ 8 this.objB.test(); 9} 10 11var B = function() {} 12 13B.prototype.test= function() { 14 //処理 15 console.log( 'B' ); 16} 17var b = new B(); 18var a = new A(b); 19a.hoge();

投稿2017/03/23 14:27

kei344

総合スコア69400

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

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

okashi123

2017/03/24 02:01

そうですね失礼致しました、修正しておきます。
kei344

2017/03/24 02:31

いや質問文を修正しても・・・。 とりあえず実証用コードに問題は無いので、元のコードを提示されない限りわかりません。 たぶんnew A(c);とかb以外を渡しているだけだと思いますが。
Lhankor_Mhy

2017/03/24 03:13

横からすみません。 > たぶんnew A(c);とかb以外を渡しているだけ そうだとすると、undefined になるのは this.objB ではなくて this.objB.test なので、エラーメッセージ Cannot read property 'test' of undefined と整合しないと思います。
kei344

2017/03/24 03:26

そうですね、正直そこまで考えていなかったです。 new A(undefined); か A.prototype.hoge = function() { var objB objB.test(); } とかのほうが良いですか?
Lhankor_Mhy

2017/03/24 03:57

瑣末な指摘でしたね。失礼いたしました。
kei344

2017/03/24 04:02

いえ、指摘ありがとうございました。 Cannot read property 'test' of undefined になるためには宣言された未定義の変数のtestプロパティにアクセスする、という状況が必要ですね。とりあえず元コードのちょっとした記述ミスだとは思います。
okashi123

2017/03/24 05:19

原因の箇所がわからなかったため簡潔にしたのですが原因の箇所が含まれていなかったようです。 申し訳ありません。
guest

0

解決しました

ご指摘にあったとおり提示していたのは本来の文章とは異なっておりました。
原因の箇所がわからず全て記述してしまうと膨大になってしまうので簡潔に書いていたのですが問題の箇所が含まれていなかったようです。大変申し訳ありませんでした。

thisの内容を出力してみるとたしかに想定と違うものを指しておりました。
thisは想定通りのものを指すように修正したらうまくいきました

この度はありがとうございました

以下原因のコードと修正内容になります。

var A = function(objB) { this.objB = objB; } A.prototype.hoge = function() { this.objB.test(); } var B = function() {} B.prototype.test= function() { //処理 }
var a; var b; $(document).ready(function() { b = new B(); a = new A(b); // ajax(a.hoge()); //原因 ajax(a.hoge.bind(a)); //修正 }) function ajax(callBack){ $.ajax({ /*省略*/ success: function(){ callBack() } }) }

投稿2017/03/24 05:17

編集2017/03/24 05:21
okashi123

総合スコア43

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問