巧用JavaScript中apply()とcall()
2527 ワード
apply()
を学ぶ前に、私たちはthis
の役割と使い方を理解しなければなりません.前の文章「JavaScriptの中のthis、チャーミングで腕白」を参照してください.もちろん、this
に関する知識を知っているなら、直接下を見てください.call()
とapply()
の役割は非常に似ていますが、パラメータタイプの違いだけが、異なる使用シーンに適応します.これらは、関数が動作するときのcontext(コンテキスト)を変更するために存在し、もう一つのことは、関数内部this
の指向を変更するためである.うん?なんですか?あなたがthisの方向を変えるという話を聞いたようです.つまり.
そうですこれで継承が実現します.Exciting
下のコードを見てください.
《 》 ( )
function animal(name,food) {
this.name = name,
this.food = food,
this.say = function() {
console.log(name +" likes " + this.food + '.');
}
}
function rabbit(name,food) {
animal.call(this,name,food);
}
var Judy = new rabbit('Judy','carrot');
Judy.say();// >>> Judy likes carrot.
Judy
というオブジェクトを宣言しましたが、rabbit
オブジェクトにはいかなる属性と方法も追加されていませんでしたが、call()
を使ってanimal
に属していた属性と方法を継承しました.animal
関数でできることは全部できます.これは一体どうやってできますか?call()のパラメータを見てみましょう.最初は
Function
クラスのthis
オブジェクトの代わりに、このオブジェクトが入ってきたthis
です.覚えておきます.this
はrabbit
関数の中で将来的にこの関数を実装する対象を指しています.このJudy
はthis
を指します.最初のパラメータを除いて、後ろのすべてのパラメータは親関数自体に渡されるパラメータです.Judy
とapply()
の機能はほぼ同じで、唯一の違いはcall()
の第二のパラメータは配列だけであり、この配列はパラメータとして元の関数のパラメータリストapply()
に伝えられる.実際の開発では、JS継承の方法はこれだけではなく、プロトタイプチェーン継承を使うのが一般的です.また、構造関数継承もあります.ここでは展開しません.そして、appyが使用するシーンは、このような場面でより多く使われています.
配列をパラメータリストに変換する必要があります.
arguments
のこの配列はパラメータリストの特性に変換され、いくつかの興味深いことができる.例えば、
apply()
方法のパラメータは1つまたは複数のパラメータだけであって、1つの配列ではなく、push()
を B
の後ろにつなぎ合わせたい場合、従来のやり方は A
を巡回して B
の後に進むので、 A
が複数のパラメータを伝えることができる機能を浪費する.私たちはこのようにしてもいいです.var list1 = [0,1,2];
var list2 = [3,4,5];
[].push.apply(list1,list2);
console.log(list1);// >>> [0,1,2,3,4,5]
ちょっとおバカに見えますか?List 1は、配列オブジェクトに属するプッシュ方法を呼び出すために、このpush方法はパラメータリストに入る必要があり、ちょうど私たちはlist 2という配列タイプのパラメータリストを持っていて、スティッチング操作を実現しました.第三行は以下の通りです.list1.push(3,4,5);
見てください.push()
はとても不思議です.同じように、apply
オブジェクト下のMath
とmax()
などの方法は、配列ではなくパラメータリストだけをサポートしています.何ができますか?また、多くのところで
min()
のこの特性は多くの便利をもたらしています.例えば、関数式プログラミングにおけるcurrying(コリニング)は、apply()
に不可欠な役割を果たしています.ここまで言うなら、次の文章は皆さんに関数コリー化を紹介します.今日は遅くなりました.先に休みます.