Javascriptのアプリとcall
3714 ワード
主にいくつかの問題を解決したいです.
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で組み替えることもできます.
通常はどのような場合に、appyがMath.minなどの特殊な使い方を使うことができますか?
ターゲット関数にはn個のパラメータリストが必要ですが、一つの配列の形式を受け取らずに([param 1],…[,paramN]]]))appyでうまく解決できます.
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でうまく解決できます.