巧用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です.覚えておきます.thisrabbit関数の中で将来的にこの関数を実装する対象を指しています.このJudythisを指します.最初のパラメータを除いて、後ろのすべてのパラメータは親関数自体に渡されるパラメータです.Judyapply()の機能はほぼ同じで、唯一の違いは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オブジェクト下のMathmax()などの方法は、配列ではなくパラメータリストだけをサポートしています.何ができますか?
また、多くのところでmin()のこの特性は多くの便利をもたらしています.例えば、関数式プログラミングにおけるcurrying(コリニング)は、apply()に不可欠な役割を果たしています.
ここまで言うなら、次の文章は皆さんに関数コリー化を紹介します.今日は遅くなりました.先に休みます.