JavaScriptでcall命令を今まで使ったことが無かったのは、どのように効率的に使えばいいか理解していなかったから。
とりあえず、色々なサイトを見て、なんとなく理解出来てきたので、他の分かりにくいサイトよりは分かりやすく書くという意気込みでメモ。
事前知識
callを覚える時は、以下の事も理解していないといけない。
this
prototype
apply
この時点で分かりにくいので、これも簡単に説明。
this
thisを指定しているトコロの上位階層の事を指すと考えるのが一番分かりやすい。
下のサンプルでは「aaa」の下位階層に「bbb」と「ccc」がいて、それぞれ、タイプは違うが、「bbb」と「ccc」のthisは親階層である「aaa」であるという事。
var aaa = {
bbb:"type-b"
ccc:function(){
alert(this.bbb);
}
};
aaa.ccc();
「ccc」内でthisを指定しているので、「this.bbb」は「aaa.bbb」と同じと考えていい。
ちなみに、「this.aaa」と指定する場合のthisは、この場合の「aaa」がグローバルOBJECTであれば、windowという風に考えていい。
※ただし、nodejsなどで使用する場合は、windowの概念がない場合もあるので、ブラウザで通常どおり、クライアント使用する場合と、サーバーサイドで使用する場合とは切り分けて考えよう。
prototype
prototypeはjavascript特有の機能で、特殊な属性だと考えましょう。
詳しい理論を覚えるよりも下記のサンプルで構文として理解した方が楽です。
var a = function(){
this.b = function(arg){
return "b/" + arg;
};
};
a.prototype.c = function(arg){
return "c/" + arg;
};
console.log(a.b("hoge"));
//res: b/hoge
console.log(a.c("hoge"));
//res: c/hoge
オブジェクト「a」内に記述されている「b」関数ですが、実は「c」も「b」と同じオブジェクトだと考えましょう。
書き方は、json的に内部に書き込むか、外出ししてprototype内に書き込むかというだけなので、コーディングの効率を考えて記述ポリシーを考えましょう。
prototypeのメリットとしては、事後にメソッドを上書きできるという点でしょうね。
※new宣言して、それぞれにprototypeを振り分けるという事もアリかもしれませんね。
apply
applyとcallは比較されたり、同じ説明に登場したりしますが、基本的には同じ動作だと考えましょう。
基本構文で考えるといいのだが、下記の通り、引き渡し値が単体ずつ個数分渡すのか、配列で渡すのかというぐらいの差です。
プログラム的にarg1をjsonオブジェクトなどで送るようにすれば、特にcallだけで何でも出来てしまうので、applyってあまり使われない命令かもしれない。
Method.call(Object,arg1,arg2);
Method.apply(Object,[arg1,arg2]);
callサンプル
僕の認識では、下記の様にcall参照するデータ部分と、内部データを切り替える事で実行される関数部分に分けると理解しやすかった。
処理は実行時に振り分け処理が行えるので、便利に使えるイメージもある。
//データ部分
var a = {name:"michel"};
var b = {name:"shelly"};
//関数部分
function getName(c){console.log(this.name + "/" + c);}
//実行部分
getName.call(b,"hoge");
具体的な説明としては、getNameというthis.nameの「this」部分をcallで任意に指定することで、対象データを入れ替えることが可能になる。
new宣言をして、内部データを振り分けてもいいし、オブジェクト思考的に、自分の得意な構造体にする事がいいのではないかと思った。
結論
無理にcallを使わなくても、そんなに不便という事はないが、複数人開発を行なっていて、それぞれに、固有のライブラリなどを作っている時に再利用するというレベルでcallを使うという事はできるかもしれない。
でも、この場合、チーム内でコーディングルールが徹底されていないと、とんでもない事故になるかもしれないけどね。
0 件のコメント:
コメントを投稿