• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[JS] private関数からオブジェクト参照)

[JS] private関数からオブジェクト参照

このQ&Aのポイント
  • JavaScriptのクラス内でprivate関数を定義し、オブジェクト変数を参照する方法について調べています。
  • 参考文献を元に、testクラス内でprivate関数func1とpublic関数func2を定義しました。
  • しかし、func2からfunc1を呼び出した際に、func2の呼び出し元のオブジェクトを参照しようとするとundefinedとなってしまいます。

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

  • ベストアンサー
回答No.1

private/public関数の扱いとthisの扱いを混同されているようです。 >クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。 func1はprivate関数になっています。 privateは外部から「アクセス禁止」ですから、a.func1()でエラーとなります。 --------------- >しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると >undefinedになってしまいます。 単純に関数定義(function a(){} )を行った場合、その中で指すthisは常にwindowです。 これは、その関数がどこで定義されているかに関わらず固定です。 以下のようにすれば、private関数から自分自身にアクセスできます。 (1) call()とapply()の扱いについて、簡単に(というか、これで全部?)説明すれば、ルールは以下の通りです。 ・関数内のthisがさす内容を、第一引数に変える。 ・func.call(obj, a, b, c)とfunc.apply(obj, [a, b, c])が同等(callは引数に羅列、applyは配列にして第二引数にまとめる) JavaScriptを長く使っていると非常に重要なメソッドになりますから、理解を深めておいた方が良いと思います。 https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Operators/Special_Operators/this_Operator#Method_binding (2)selfはサンプルに書かれていた物をそのままコピーされているような書き方ですが、 この変数の使い方は、クロージャーという名前で頻出しますので、クロージャーとして勉強する方が良いと思います。 (1) callまたはapplyを使用 ------------- function test(){ //var self = this; // 削除してもしなくても良いが、小メモリ化するなら削除 // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); ////////// } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1.call(this); ////////////thisのさす内容を変更 }; } (2) クロージャーを使用 ------------- function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(self.data2); /////////selfを使う } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; }

palayo
質問者

お礼

ありがとうございました。 selfを活用する方法を適用することにしました。

その他の回答 (1)

回答No.2

No.1です。 >オブジェクト変数を参照でき、 >クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。 改行でつながっていたのを見逃していました。 最初の段落は無視してください。 失礼しました。 定義する方法はありません。 呼び出す時にthisを渡してください。

関連するQ&A