- ベストアンサー
[JS] private関数からオブジェクト参照
- JavaScriptのクラス内でprivate関数を定義し、オブジェクト変数を参照する方法について調べています。
- 参考文献を元に、testクラス内でprivate関数func1とpublic関数func2を定義しました。
- しかし、func2からfunc1を呼び出した際に、func2の呼び出し元のオブジェクトを参照しようとするとundefinedとなってしまいます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
関連するQ&A
- 関数の引数とグローバル変数について
javascript初心者です。 どうしても分からないことがあるので質問させて頂きます。 グローバル変数の値を関数で処理して増やしコンソールログに表示していく、 というようなソースがあるとします。(以下) //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 var afunc = function(){ a++; console.log(a); } var bfunc = function(){ b++; console.log(b); } var cfunc = function(){ c++; console.log(c); //onclickなどで呼び出す関数 function test1(){ var aplus = new afunc(); } function test2(){ var aplus = new bfunc(); } function test3(){ var aplus = new cfunc(); } グローバル変数や関数などが3つと数が少ないならこれでもいいかも知れませんが、 これが数十個とかに増えると、ソースの量もかなり多くなり 管理も大変になると思い簡略化させたいと考えました。 そこで以下のように変えてみたのですが、 加算がうまくいきません。 //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 vvar xxfunc = function(xx){ this.xx = xx; this.show = function() { this.xx++; console.log(this.xx); } } //onclickなどで呼び出す関数 function test1(){ var aplus = new xxfunc(a); aplus.show(); } function test2(){ var aplus = new xxfunc(b); aplus.show(); } function test3(){ var aplus = new xxfunc(c); aplus.show(); } もしかすると、関数の引数にはグローバル変数を指定することができないのでしょうか? 何かうまいやり方はあるでしょうか? プログラミング自体が勉強し始めたばかりなので、 おかしなソースの書き方をしているかもしれませんのが、 ご教授、よろしくお願いいたします。
- ベストアンサー
- JavaScript
- [JS]setTimeoutでクラス関数を使いたい
他の処理を待ってから、別の処理を実施したい場合に、setTimeoutを使用するのが 一般的だと思いますが、特定のクラスの関数を実行する方法がよくわかりません。 グローバル変数を使用する場合には以下で動きます。 ※待機の部分は、問題を簡略化するため今回は3回実行完了まで、としています。 counter = 0; max = 3; method(); function method(){ if ( counter < max ) { timerId = setTimeout(method, 10 ); console.log(counter); counter++; } else { console.log("done"); } } 出力は以下のとおり。 0 1 2 done methodやcounter, maxなどを隠蔽するため、クラス関数を作り、以下のようにしました。 a = new test(); a.method(); function test(){ this.counter = 0; this.max = 3; this.method = function(){ if ( this.counter < this.max ) { timerId = setTimeout(this.method, 10 ); console.log(this.counter); this.counter++; } else { console.log("done"); } } } 出力は以下のようになってしまい、意図したように実行できていません。 0 done このような場合、どのようにしてクラス関数を再呼び出しするのでしょうか。
- ベストアンサー
- JavaScript
- setTimeoutのthis参照について
prototypeメソッドの中でsetTimeout関数を使用したところ、thisで自身の関数を参照しなくなりました。setTimeoutの挙動についてぐぐってみたのですが、いまいちsetTimeoutを使用したときのスムーズな記述方法がわかりません。 ******************************** var hoge=function(){ this.myName="ほげ"; } hoge.prototype={ init:function(){ setTimeout(function(){ hoge.prototype.displayName(); // ★(1)setTimeout関数の中でのメソッドの適した呼び出し方は? // ↑の記述でも呼び出せるけど、間違ってる気がする。。 },1000) }, displayName:function(){ // ★(2)ここでhogeオブジェクトのmyNameプロパティを参照するにはどう記述すれば良いのか? //console.log(this.myName); //↑setTimeoutを使ったのでthis参照はwindowオブジェクトになっているから違う //console.log(hoge.myName); →undefinedを返す } } window.onload=function(){ var a=new hoge(); a.init(); } ******************************** 上記のようなprototype関数を使用したときのスムーズな記述方法を教えていただけませんでしょうか。 知りたいのは下記2点です。 ★(1)prototypeメソッドを使用したとき、setTimeout関数の中でのメソッドの適した呼び出し方は? ★(2)setTimeout関数内で呼び出したメソッドから、自身のオブジェクトのプロパティを参照するにはどう記述すれば良いのか? 初心者なので説明が下手だったり、質問内容で間違った記述があるかもしれません。 質問内容で問題がありましたらご指摘いただけると助かります。
- ベストアンサー
- JavaScript
- javascriptでオブジェクトのメソッドを使う
JavaScriptでnewでオブジェクト化したクラス(?)のメソッド、フィールドを利用する方法を教えて下さい。 javascriptにもオブジェクト化という考え方があると聞いたのですが、 例えば、Javaでいうsetter getterのようなメソッドを作り、使用することはできるのでしょうか? 下記のようなコードを実行したところ Uncaught TypeError: Object #<mousePosi> has no method 'setPara' というエラーが出てしまい、setParaというメソッドはない。と言われてしまいます。 しかし、mousePosi()をオブジェクト化することはできているようなので、 setParaとgetParaを使えるのではないかとおもいました。 どなたかアドバイス下さい。お願いします。 ------------------------------------------------------------------------------------------------- (function LineMain() { console.log("マウスの位置座標を表示"); // console.log("X座標=" + mymouse.x + ",Y座標=" + mymouse.y); //マウスムーブでeventControlを呼び出し addEventListener("mousemove", eventControl, false); function eventControl(event) { var event = event; var myMousePosi = new mousePosi(); myMousePosi.setPara(event); // console.log("X座標=" + obj.getMouse().x + ",Y座標=" + obj.getMouse().y); } function mousePosi() { var paraMouse = { x : 0, y : 0 }; function setPara(event) { this.paraMouse.x = event.x; this.paraMouse.y = event.y; } function getPara() { return this.paraMouse; } } })();
- ベストアンサー
- JavaScript
- node.jsのシェル上で
コンソール上でnodejsを起動してシェルとしてつかった場合 var x="グローバル変数"; console.log(x); //とするとグローバル変数と出力されます。 さらに console.log(this.x); //とするとグローバル変数と出力されます。 そもそもグローバル変数とはトップレベルコードにおけるオブジェクトのプロパティとあります。 ブラウザだと、トップレベルのスコープで定義した変数は alert(window . variable); でアクセスできます。 ですから、nodeコンソール上で xとっ宣言した変数がthis.xとトップオブジェクトとしてアクセスできることはわかったのですが これをコンソールではなく、jsファイルに描いてそれをnodeコマンドで実行した場合 ~$ node test.js といった具合に実行させた場合 どうも、undefindeと表示されてしまうのです。 これは何が原因でundefinedと出力されてしまうのでしょうか?
- ベストアンサー
- JavaScript
- 連想配列/オブジェクト? どちらなのか教えて
・色々やっている内よく分からないデータになったので、連想配列/オブジェクト? どちらなのか教えてください ■前提オブジェクト var t1 = { key1: '佐藤' , key2: '鈴木' }; ■配列作成 var t2 = new Array(); ■配列にオブジェクトを格納? t2[t1['key1']]=t1['key2']; console.log(t2); //[佐藤: "鈴木"] ■アクセスしてみる console.log("t2['佐藤']"); //鈴木 console.log(t2[0]); //undefined ■質問 ・t2[0]は、なぜundefined? ・t2配列0番目に「佐藤: "鈴木"」というオブジェクトが入っていると思ったのですが… ・t2は、連想配列/オブジェクトの何れでしょうか? ・挙動から推測するとオブジェクトっぽいのですが、外側のかっこが[]でもオブジェクトなのでしょうか? ・外側のかっこが[]は配列で、外側のかっこが{}はオブジェクトと思っているのですが…
- ベストアンサー
- JavaScript
- イベントリスナーの部分を関数にしたい
イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();
- ベストアンサー
- JavaScript
- 複数の無名関数を合成したい
javascriptにおいて、無名関数を合成する方法を知っている方はいらっしゃるでしょうか? var func1 = function(){ alert('func1'); } var func2 = function(){ alert('func2'); } この二つの関数を合成して、 var func3 = function(){ alert('func1'); alert('func2'); } という風に合成したいのです。 jQueryを利用して var func3 = $.extend(func1, $func2); と試しましたが、func3 == func1 となってしまうようです。 また、単純に、var func3 = func1 + func2; では、 func3 = function(){alert('func1');}function(){alert('func2');} と意味を成さないものになってしまいます。
- 締切済み
- JavaScript
- 関数を呼んだら、その中の関数も自動実行される?
・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = { portal : function( arg ) { var goo = function(arg){ console.log(arg); }(arg); } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = { portal : function( arg ) { var goo = function(arg){ console.log(arg); }(arg); goo(); } } obj.portal("あ"); //TypeError: undefined is not a function
- ベストアンサー
- JavaScript
- 即時関数でプライベート変数的になってる理由を教えて
即時関数内で、プライベート変数的な動きになっている(?)コードがあるのですが、呼び出せない理由を教えてください ・呼び出せる例1 (function() { hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せる例2 (function() { var hoge1 = {}; hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せない例 (function() { var hoge1 = {},hoge2 = 'ホゲ2'; })() console.log(hoge2); ■質問1 ・どうして呼び出せないのでしょうか? ・varでローカル宣言(?)してるhoge1オブジェクトに紐づいているから? ・つまり、hoge2オブジェクトを生成している場所が違う? ■質問2 ・呼び出せない状態の時、hoge2はプライベート変数になっているのでしょうか? ■質問3 ・そもそもどうして呼び出せるのでしょうか? ・即時関数は(名前もしくはスコープ)空間を作り閉じ込めるので~、という記述を、どこかで見かけたような気もするのですが…
- ベストアンサー
- JavaScript
お礼
ありがとうございました。 selfを活用する方法を適用することにしました。