javascriptのcallとappy方法

2493 ワード

1、方法の定義
call方法:文法:call([thisObj],arg 1[,arg 2[,   [.argN]]]定義:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.説明:コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.appyメソッド:構文:appy([thisObj])定義:あるオブジェクトを適用する方法で、現在のオブジェクトを別のオブジェクトに置き換えます.説明:もしargArayが有効な配列ではないか、またはargmentsオブジェクトではないなら、TypeErrorを引き起こすことになります.argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない.
 
2、常用例
a、
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);/注意:jsの関数はオブジェクトであり、関数名はFunctionオブジェクトへの参照です.
b、
function Animal(){  
    this.name = "Animal";  
    this.showName = function(){  
        alert(this.name);  
    }  
}  

function Cat(){  
    this.name = "Cat";  
}  
 
var animal = new Animal();  
var cat = new Cat();  
  
//  call apply  ,     Animal   showName()      cat    。  
//     "Cat"  
animal.showName.call(cat,",");  
//animal.showName.apply(cat,[]);
 callとはanimalの方法をcatに置いて実行するという意味です.元々はcatはshowNameの方法がないので、今はanimalのshowNameの方法をcatに置いて実行します.だから、this.nameはCatであるべきです.
c、継承の実現
function Animal(name){    
     this.name = name;    
     this.showName = function(){    
         alert(this.name);    
     }    
 }    
   
 function Cat(name){  
     Animal.call(this, name);  
 }    
   
 var cat = new Cat("Black Cat");   
 cat.showName();
 アニマル.callとは、アニマルオブジェクトをthisオブジェクトの代わりに使用するという意味で、アニマルのすべての属性と方法がCatにあるのではないでしょうか?
d、複数引継ぎ
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);
}
 簡単です.二つのコールを使って多重継承ができます.もちろん、jsの継承は他の方法もあります.例えば、プロトタイプチェーンを使って、これは本明細書の範疇ではなく、ここでコールの使い方を説明します.callと言っても、もちろんappyがあります.この二つの方法は基本的には一つの意味です.違いはcallの二つ目のパラメータは任意のタイプでもいいです.appyの二つ目のパラメータは配列でなければなりません.argmentsとcalerでもいいです.