Javascriptのアプリとcall


主にいくつかの問題を解決したいです.
1.        アプリとコールの違いはどこですか?
2.        どんな場合にアプリを使いますか?どんな場合にコールを使いますか?
3.        他の巧みな使い方
まずインターネットでappyとcallの定義を調べて、この二つの方法の意味と使い方を例で説明します.
         別のオブジェクトをハイジャックできる方法で、別のオブジェクトの属性を継承します.
 このオブジェクトは、Functionクラスのthisオブジェクトargsの代わりになります.これは配列です.パラメータとしてFunctionに伝えます.
         call:appyと同じ意味ですが、パラメータリストが違います.
 Function.call(obj,param 1[,param 2[,paramN]]])Obj:このオブジェクトはFunctionクラスのthisオブジェクトparamsの代わりになります.これはパラメータリストです.
1.        apply例:
<script type=「text/javascript」>   /*人類を定義します.    function Person(name,age)    {        this.name=name;        this.age=age;    }    /*学生クラスを定義します.    functionStudent(name,age,grade)    {        Person.appply(this,argments);        this.grade=grade    }    //学生クラスを作成します.    var student=new Student(「qian」、21、「一年生」)   //テスト    alert("name:"+student.name+""+"age:"+student.age+""+"grade:"+student.grade);   //みんなはテスト結果を見ることができます. メッセージ:21 grade:一年生です   //学生の中で、私はnameとageの属性に値をつけていませんでした.なぜこの二つの属性の値が存在しますか?これがappyの不思議なところです.
分析:Person.apply(this,argments);
this:オブジェクトを作成する時に代表されるのはstudentです.
argments:行列です.つまり「Qian」、「21」、「一年生」です.
                   つまり、StudentでPersonというカテゴリーの内容を実行し、Personというカテゴリーにthis.nameなどの語句があり、これでstudentオブジェクトに属性を作成します.
2.        コールの例
Studen関数では、appyを以下のように修正できます.
Person.call(this,name,age);
これでいいです
3.        どんな場合にアプリを使いますか?どんな場合にコールを使いますか?
対象パラメータの場合、パラメータの形式が配列の場合、例えば、appy例でパラメータargmentsが伝達されています.このパラメータは配列タイプです.Personを呼び出したときのパラメータのリストは対応一致しています.(age,name)、Studentのパラメータリストは(name,age,grade)であり、これはコールで実現できます.すなわち、パラメータリストの対応する値の位置を直接指定します.
4.        他のいくつかの巧みな使い方
注意深い人が気づいたかもしれませんが、appyメソッドを呼び出した時、最初のパラメータは対象で、二つ目のパラメータは一つの配列です. Personを呼び出した時、彼が必要なのは配列ではありませんでした.しかし、なぜ彼は配列を一つのパラメータに解析できますか?これをプログラムで実現させると、配列の各項目をパラメータのリストに置き換えるために時間がかかるかもしれません.この点の特性を利用して、下記の高効率な方法があります.
 
a)        Math.maxは、行列の中で最大のアイテムを得ることができます.
Math.maxパラメータではMath.max([param 1,param 2]はサポートされていませんので、つまり配列です.
しかし、Math.max(param 1、param 2、param 3...)をサポートしていますので、先ほどのappyの特徴によって、var max=Math.max.apply(null、array)を解決できます.このように簡単に1つの配列の中で最大の項目を得ることができます.
         これは呼び出し時に最初のパラメータをnullにあげました.これは対象がないので、この方法を使って計算してください.戻りの結果を得たらいいです.直接にnullを渡しました.
b)        Math.min  行列の中で一番小さいものが得られます.
同じmaxと同じ思想であるvar min=Math.min.apply(null,array)
c)        Aray.prototype.pushは二つの配列の結合を実現できます.
同じpush方法ではPushの配列を提供していませんが、Push(param 1、param、…paramN)を提供していますので、この配列をappyで組み替えることもできます.
1      vararr1=new Array("1","2","3");
2 
3      vararr2=new Array("4","5","6");
4 
5      Array.prototype.push.apply(arr1,arr2);
arr 1は、push方法を呼び出し、パラメータは、appyによって配列をパラメータリストのセットに換えることができることも理解されよう.
通常はどのような場合に、appyがMath.minなどの特殊な使い方を使うことができますか?
ターゲット関数にはn個のパラメータリストが必要ですが、一つの配列の形式を受け取らずに([param 1],…[,paramN]]]))appyでうまく解決できます.