call method appelle une méthode d'un objet et remplace l'objet actuel par un autre objet."/> call method appelle une méthode d'un objet et remplace l'objet actuel par un autre objet.">

Maison  >  Article  >  interface Web  >  Explication détaillée de la façon d'utiliser call et apply pour implémenter l'héritage en javascript

Explication détaillée de la façon d'utiliser call et apply pour implémenter l'héritage en javascript

伊谢尔伦
伊谢尔伦original
2017-07-20 15:02:301827parcourir

Call et apply en js peuvent être hérités. La seule différence de paramètre est que l'application correspondant à func.call(func1,var1,var2,var3) est écrite comme suit : func.apply(func1,[var1). ,var2 ,var3]).

Explication de l'appel dans le manuel JS :

d41813e6630d9f7e981ba6f409905b82call method
Appeler une méthode d'un objet à un autre L'objet remplace l'objet actuel.

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

Paramètres
thisObj
Facultatif. L'objet qui sera utilisé comme objet actuel.

arg1, arg2, , argN
Facultatif. Une séquence de paramètres de méthode sera transmise.

Explication La méthode
call peut être utilisée pour appeler une méthode à la place d'un autre objet. La méthode d'appel modifie le contexte d'objet d'une fonction du contexte initial au nouvel objet spécifié par thisObj.

Si le paramètre thisObj n'est pas fourni, l'objet Global est utilisé comme thisObj. 0fe0b7695b8025b8365ca0c050e039db

Pour faire simple, la fonction de ces deux fonctions est en fait de changer le pointeur interne de l'objet, c'est-à-dire de changer le contenu pointé par celui-ci de l'objet. Ceci est parfois utile dans la programmation js orientée objet. Prenons apply comme exemple pour parler du rôle important de ces deux fonctions dans js. Tels que :

<SPAN style="FONT-SIZE: 18px"> function Person(name,age){   //定义一个类   
        this.name=name;     //名字   
        this.age=age;       //年龄   
        this.sayhello=function(){alert(this.name)};  
    }  
    function Print(){            //显示类的属性   
        this.funcName="Print";  
        this.show=function(){  
            var msg=[];  
            for(var key in this){  
                if(typeof(this[key])!="function"){  
                    msg.push([key,":",this[key]].join(""));  
                }  
            }  
            alert(msg.join(" "));  
        };  
    }  
    function Student(name,age,grade,school){    //学生类   
        Person.apply(this,arguments);//比call优越的地方   
        Print.apply(this,arguments);  
        this.grade=grade;                //年级   
        this.school=school;                 //学校   
    }  
    var p1=new Person("开化",80);  
    p1.sayhello();  
    var s1=new Student("云飞",40,9,"岳麓书院");  
    s1.show();  
    s1.sayhello();  
    alert(s1.funcName);</SPAN>

De plus, Function.apply() joue un rôle de premier plan dans l'amélioration des performances du programme :
Commençons par la fonction Math.max() qui peut être suivie de Math.max. tous les paramètres, et renvoie enfin la valeur maximale parmi tous les paramètres.
Par exemple

<SPAN style="FONT-SIZE: 18px">alert(Math.max(5,8));   //8   
    alert(Math.max(5,7,9,3,1,6));   //9   
    //但是在很多情况下,我们需要找出数组中最大的元素。   
    var arr=[5,7,9,1];  
    //alert(Math.max(arr));    // 这样却是不行的。NaN   
    //要这样写   
    function getMax(arr){  
        var arrLen=arr.length;  
        for(var i=0,ret=arr[0];i<arrLen;i++){  
            ret=Math.max(ret,arr[i]);  
        }  
        return ret;  
    }  
    alert(getMax(arr)); //9   
    //换用apply,可以这样写   
    function getMax2(arr){  
        return Math.max.apply(null,arr);  
    }  
    alert(getMax2(arr)); //9   
    //两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。   
    //再比如数组的push方法。   
    var arr1=[1,3,4];  
    var arr2=[3,4,5];  
    //如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]   
    //arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]   
    //我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)   
    var arrLen=arr2.length;  
    for(var i=0;i<arrLen;i++){  
        arr1.push(arr2[i]);  
    }  
    //自从有了Apply,事情就变得如此简单   
    Array.prototype.push.apply(arr1,arr2); //现在arr1就是想要的结果</SPAN>


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn