call,appy,argments


読む前に理解が必要です.
JSにnewがない対象は対象にthisは存在しません.
たとえば:
function a(){
this.b=「hi」
this.cl=function(){alert('hi')}
)
alert(a.b)//out undefined
try{
a.c()
}catch(e){
alert(e->getmessage();/出力あり
)
var a=new a()
alert(a.b)//輸出hi
a.c()///輸出hi
 
1、コールコール方法は、オブジェクトを別のオブジェクトに置き換える方法を呼び出します.call([thisObj],arg 1[,arg 2[,argN]]])パラメータthisObjを選択できます.現在のオブジェクトとして使用されます.arg 1、arg 2、argNオプションがあります.転送される方法のパラメータ系列を指定します.コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.単純な列(関数呼び出し):
function add(a,b) 
{ 
alert(a+b); 
} 
function sub(a,b) 
{ 
alert(a-b); 
} 
add.call(sub,3,1); 
 この例ではsub,add.call(sub,3,1)==add(3,1)をaddで置換するという意味ですので、実行結果は:alert(4)です.
複雑な点の例(メソッドコール):
function Class1() 
{ 
this.name = "class1"; 
this.showNam = function() 
{ 
alert(this.name); 
} 
} 
function Class2() 
{ 
this.name = "class2"; 
} 
var c1 = new Class1(); 
var c2 = new Class2(); 
c1.showNam.call(c2); 
 なお、callとは、c 1の方法をc 2にセットして実行するという意味です.元々は、c 2はshowNam()の方法がないので、今はc 1のshowNam()の方法をc 2に置いて実行しています.だから、this.nameはclass 2であるべきです.実行の結果は、alert(clast 2);
継承を実現する
function Class1() 
{ 
this.showTxt = function(txt) 
{ 
alert(txt); 
} 
} 
function Class2() 
{ 
Class1.call(this); 
} 
var c2 = new Class2(); 
c2.showTxt("cc"); 
   これでクラス2はクラス1を継承します.クラス1.calとは、クラス1のオブジェクトをthisオブジェクトの代わりにするという意味です.クラス2の中にはクラス1の属性と方法が全部あるのではないですか?はい、そうです.これはjavaScriptがオブジェクトに向かう継承をどのようにシミュレートしているのか、多重継承も可能です.
 
多重継承
function Class10() 
{ 
this.showSub = function(a,b) 
{ 
alert(a-b); 
} 
} 
function Class11() 
{ 
this.showAdd = function(a,b) 
{ 
alert(a+b); 
} 
} 

function Class2() 
{ 
Class10.call(this); 
Class11.call(this); 
} 

 簡単です.二つのcallを使って多重継承を実現しました.もちろん、jsの継承には他の方法があります.例えば、プロトタイプチェーンを使って、これは本文の範疇ではなく、ここでcallの使い方を説明します.
リロード:
function a(){
        this.f=function(){
            alert("af");
        };
        this.c=function(){
            alert("ac");
        }
    }
    function b(){
        a.call(this);
        var bf=this.f;
        this.f=function(){
            bf();//      
        alert("bf")
        };
    }
    var ob=new b();
    ob.f();//  af,bf
    ob.c();//  ac
 callというのはもちろん、appyもありますが、この2つの方法は基本的にはcallの2番目のパラメータは任意のタイプでもいいですが、appyの2番目のパラメータは配列でなければなりません.パラメータが明確である場合は、コールができます.パラメータが不明な場合は、appyで合成argmentsを与えることができます.
2、アプリ
applyとcallの両方については役割は同じですが、両者はパラメータに違いがあります.最初のパラメータの意味は同じですが、2番目のパラメータ:applyはパラメータ配列、つまり複数のパラメータを組み合わせて1つの配列にして入ってきます.callはcallのパラメータとして入ってきます.func.call(func 1,var 1,var 2,var 3)に対応するappyの書き方は、func.apply(func 1,var 2,var 3)です.
テクニック(コードが優雅で実行効率が高い)コードは以下の通りです.alert(Math.max(5,8))//8 alert(Math.max(5,7,9,3,1,6))/9
var arr=[5,7,9,1]alert;
 
注意:call applyはクラスにとって、つまり方法体にとって、あるいはオブジェクト内のメソッド体にとって、単純な対象自体にはこの二つの関数がない.
function a(){
        this.f=function(){alert("af");}
    }
    function b(){
    
    }
    var oa=new a();
    var ob=new b();
    oa.call(ob);//   ~~
  a.call(ob);ob.f();//  
   oa.f.call(ob);//   
 
3.アーグメンント
argmentsは同じ配列であり、配列の対象ではないが、それと類似している(類似している)配列は、配列のようなアクセス特性および方式を持っているので、argments[n]によって対応する単一パラメータの値にアクセスでき、配列長属性lengthを持っているという.また、argmentsオブジェクトは、関数宣言によって定義されたパラメータリストに限定されず、実際に関数に伝達されるパラメータを格納し、argmentsオブジェクトを明示的に作成することができません.アーグメンントオブジェクトは関数の開始時のみ使用できます.
function ArgTest(a, b){
    var i, s = "The ArgTest function expected ";
    var numargs = arguments.length;     //           。
    var expargs = ArgTest.length;       //          。
    if (expargs < 2)
       s += expargs + " argument. ";
    else
       s += expargs + " arguments. ";
    if (numargs < 2)
      s += numargs + " was passed.";
    else
      s += numargs + " were passed.";
    s += "

" for (i =0 ; i < numargs; i++){ // 。 s += " Arg " + i + " = " + arguments[i] + "
"; } return(s); // 。 } window.onload=function() { alert(ArgTest(1,2,3)); }
   出力:The ArgTest function expected 2 argments.3 were passed.
             Ag 0=1
             Ag 1=2
             Ag 2=3 
詳細出所参照:http://www.jb51.net/article/25080.htm
                  : http://www.cnblogs.com/liushannet/archive/2010/10/28/1863999.html