doubleyong
管理员
管理员
  • 最后登录2026-05-25
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:7641回复:1

[js]JS中的call()方法和apply()方法用法总结

楼主#
更多 发布于:2018-12-27 20:11
JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧。

1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。
2. 相同点:这两个方法的作用是一样的。

都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域
一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向

call()方法使用示例:
//例1
   <script>
       window.color = 'red';
       document.color = 'yellow';
       var s1 = {color: 'blue' };
       function changeColor(){
           console.log(this.color);
       }
       changeColor.call();         //red (默认传递参数)
       changeColor.call(window);   //red
       changeColor.call(document); //yellow
       changeColor.call(this);     //red
       changeColor.call(s1);       //blue
   </script>
   //例2
   var Pet = {
       words : '...',
       speak : function (say) {
           console.log(say + ''+ this.words)
       }
   }
   Pet.speak('Speak'); // 结果:Speak...
   var Dog = {
       words:'Wang'
   }
   //将this的指向改变成了Dog
   Pet.speak.call(Dog, 'Speak'); //结果: SpeakWang
apply()方法使用示例:
//例1
   <script>
       window.number = 'one';
       document.number = 'two';
       var s1 = {number: 'three' };
       function changeColor(){
           console.log(this.number);
       }
       changeColor.apply();         //one (默认传参)
       changeColor.apply(window);   //one
       changeColor.apply(document); //two
       changeColor.apply(this);     //one
       changeColor.apply(s1);       //three
   </script>
   //例2
   function Pet(words){
       this.words = words;
       this.speak = function () {
           console.log( this.words)
       }
   }
   function Dog(words){
       //Pet.call(this, words); //结果: Wang
      Pet.apply(this, arguments); //结果: Wang
   }
   var dog = new Dog('Wang');
   dog.speak();

3. 不同点:接收参数的方式不同。
apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
语法:apply([thisObj [,argArray] ]);,调用一个对象的一个方法,2另一个对象替换当前对象。

说明:如果argArray不是一个有效数组或不是arguments对象,那么将导致一个
TypeError,如果没有提供argArray和thisObj任何一个参数,那么Global对象将用作thisObj。

call()方法 第一个参数和apply()方法的一样,但是传递给函数的参数必须列举出来。
语法:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);,应用某一对象的一个方法,用另一个对象替换当前对象。

说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。

使用示例1:
function add(c,d){
        return this.a + this.b + c + d;
    }
    var s = {a:1, b:2};
    console.log(add.call(s,3,4)); // 1+2+3+4 = 10
    console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14
使用示例2:
<script>
        window.firstName = "Cynthia"; 
        window.lastName = "_xie";
        var myObject = {firstName:'my', lastName:'Object'};
        function getName(){
            console.log(this.firstName + this.lastName);
        }
        function getMessage(sex,age){
            console.log(this.firstName + this.lastName + " 性别: " + sex + " age: " + age );
        }
        getName.call(window); // Cynthia_xie
        getName.call(myObject); // myObject
        getName.apply(window); // Cynthia_xie
        getName.apply(myObject);// myObject
        getMessage.call(window,"女",21); //Cynthia_xie 性别: 女 age: 21
        getMessage.apply(window,["女",21]); // Cynthia_xie 性别: 女 age: 21
        getMessage.call(myObject,"未知",22); //myObject 性别: 未知 age: 22
        getMessage.apply(myObject,["未知",22]); // myObject 性别: 未知 age: 22
    </script>

--------------------- 作者:Cynthia(小英子)
来源:CSDN

原文:https://blog.csdn.net/ganyingxie123456/article/details/70855586
版权声明:本文为博主原创文章,转载请附上博文链接!
知识需要管理,知识需要分享
1392227049
新手
新手
  • 最后登录2019-07-10
  • 发帖数2
沙发#
发布于:2019-01-07 13:19
前面写了个ES5继承demo 刚刚好有个call apply的小栗子

算是实战用法吧

<script>
        function person(name,age) {
            this.name = name;
            this.age = age;
        }
        //添加静态方法   es5与e6 具有一定的区别  相同点  person 本体能调用方法
        //es5 子类无法调用父类的静态方法
        //es6 子类拥有父类的静态方法 但是实例无法调用该方法
        person.Hi = function () {
            console.log('say hi')
        }
        person.prototype.show = function (){
            console.log('展示父类')
        }
        var p1 = new person('小李',18)
        function son(eat,name,age) {
            
            person.call(this,name,age)
            person.apply(this,arguments)
            this.eat = eat;
        }
        //完美实现继承   干净的原型方法
        son.prototype = Object.create(person.prototype)
        //还原子类构造器
        son.prototype.constructor = son;
        son.prototype.say = function() {
            console.log('吃饭')
        }
        var son1 = new son('水果','姓名',18);
    
    </script>
游客


返回顶部

公众号

公众号