クラス -> 内部関数
クラス内に設置したローカルメソッド。
外部からは呼べない。
- var hoge = ( function() {
- // constructor
- var hoge = function() {
- this.x = 5;
- };
- // 内部関数(クラス内メソッド)
- function moge() {} ← これ
- var p = hoge.prototype;
- p.f1 = function() {
- return true;
- };
- return hoge;
- })();
コンストラクタからでも、公開メソッドからでも関数名(メソッド名)で呼び出せた。
- p.f2 = function() {
- moge();
- };
内部関数内では、this を使えない。
解決策は後述。
引数があると、通常通りでは呼び出せなかった。
- function moge( arg ) {}
- p.f2 = function() {
- moge( arg );
- };
これでは、syntax error にはならないけど、値が渡らない。
上記2点を一度に解決。
(解決法はわかったけど、まだあまりよく理解できていない)
apply メソッド、または call メソッドを利用する。
つまり、下記のように呼び出す。
- function moge( arg ) {}
- p.f2 = function() {
- moge.apply( this, arg );
- moge.call( this, arg );
- };
参考サイトを見ると
callはFunction.prototypeの中にあります。
と書いてあるので、プロパティ・オブジェクト からの呼び出しだから、というなのかもしれないけど、今はまだよくわかっていない。
引数に指定した this。
でも、内部関数側は受け取っていない。
どうも、自動的に(強制的に?暗示的に?)受け取るらしく
これで、内部関数内で this を利用できる。
また、何も this を渡さなければいけないわけではなく
要は内部関数内で this と記述して利用したいオブジェクトを指定すればよいらしい。
apply
- var args = [ 1, 2, 3 ];
- moge.apply( this, args );
apply は、this 以外の引数を、配列にまとめて渡す。
本当に配列を渡すときとか、引数が多い時、または変更が頻繁にあるときなどには便利。
call
- moge.call( this, 1, 2, 3 );
call は、this 以外の引数を列挙して渡す。