Javascriptにおけるcallの使い方の例

2032 ワード

用法一(よくある用法):
表現形式は、オブジェクト・方法・コール(別のオブジェクト)となり、現在のオブジェクトを別のオブジェクトに置き換えて実行する方法を意味します.まず例を見ます
 
  
function Class1(){
    this.name = "class1";
    this.showName = function(){
        alert(this.name);
    }
}
function Class2(){
    this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();

c1.showName.call(c2);
c2.showName();        //

まず二つのfunctionを定義しました.それぞれClass 1とClass 2です.それらの主な違いはClass 2がClass 1より一つ多くなったshowName()方法です.次に、Class 1、Class 2に対応するオブジェクトc 1とc 2を定義しました.この時、私達ははっきりと知っています.c 1はshowName()の方法がありますが、c 2はありません.しかし、奇跡が現れました.c 1.sham.cal(c 2)を実行すると、c 2のname値、つまり「class 2」がはじけます.実際には、私たちが実行する任然はc 1の方法ですが、オブジェクトc 2をオブジェクトc 1に意図的にすり替えて実行した後、それらは任意に定義された時の様子です.c 2を検出するために多くの方法がありますか?これは実行できないもので、ブラウザでObjectのエラーを報告します.
なぜこのようにしますか?前に述べましたが、これは一時的な発想の使い方です.私たちはその効率的なプログラミングを利用しています.ただし、これは限定されるものではなく、c 1とc 2で置換対象と置換対象を表し、fun 1でc 1固有の方法を表すものとする.1、fun 1にパラメータが必要でなく、親関数の任意の局所変数が必要でない場合、c 1.fun 1.call(c 2)とc 1.fun 1()は特に区別がない.2、fun 1はパラメータが必要ではないが、親関数の変数を使うと、c 1とc 2のfunctionと同じ名前のfun 1が使用される変数を生成する必要があります.3、fun 1にパラメータが必要な場合、形をc 1.fun 1.call(c 2,パラメータ1,パラメータ2,パラメータn)に書き換える場合、c 1のfunctionの変数名は、c 2を生成するfunctionの変数名と同名ではなく、対応すれば良いです.実は、私達はcallのこのような使い方を使う時、c 2とc 1は構造と機能の上ですでにとても大きい類似性があって、だから上述の3点は回避しやすいです.
使い方二:
functionの定義の過程で使用して、表現形式:もう一つの既存関数.call(this)は、もう一つの既存関数の変数、方法をすべて自分の関数にクローンして、継承に似た機能を実現します.例を見ます
 
  
function Animal(name){
    this.name = name;
    this.showName = function(){
        alert(this.name);
    }
};

var animal = new Animal("small_animal");
animal.showName();    //alert("small_animal")

function Cat(name){
    Animal.call(this, name);
};

//var Animal = null;    //

var cat = new Cat("black_cat");
cat.showName();     //alert("black_cat")