zoukankan      html  css  js  c++  java
  • call和apply

    本文根据知乎中一些大佬的回复整理完成,如有更深见解,欢迎加入讨论~~

    在js OOP中,经常会这样定义:

    function cat(){
    
    }
    cat.prototype = {
        food: 'fish',
        say: function(){
            console.log('I love ' + this.food);
        }        
    }
    
    var blackCat = new cat;
    blackCat.say(); //I love fish

    使用call和apply是为了动态改变this而出现的,当一个对象没有某个方法,但是其他方法有,可以借助call或apply来使用其他对象的方法来操作:

    function cat(){
    
    }
    cat.prototype = {
        food: 'fish',
        say: function(){
            console.log('I love ' + this.food);
        }        
    }
    
    var blackCat = new cat;
    blackCat.say(); //I love fish
    var whiteDog = {food: 'bone'};
    blackCat.say.call(whiteDog); //I love bone

    call 和 apply 的区别是,call 需要把参数按顺序传递进去,而 apply 是把参数放在数组中传递。

    因此,js 中某个函数的参数数量是不固定的,可以使用 apply,将参数 push 进数组进行传递,也可以使用 arguments 对象来进行遍历获取所有参数;在参数明确知道,数目确定的时候可以使用 call.

    举个例子:

    通过document.getElementsByTagName 选择的 dom 节点是一种类似于array的对象,但是它不能应用Array 下的 push , pop等方法,我们可以通过:

    var domNodes = Array.prototype.slice.call(document.getElementsByTagName('*'));

    这样domNodes 就可以使用Array 下所有的方法了。

  • 相关阅读:
    附件下载遇到 ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION 错误
    Javascript模块编程&jQuery插件开发学习笔记
    网站推荐
    分布式服务下Quartz任务变为EREOR分析及解决
    Quartz任务监听器
    定时任务框架Quartz基本使用
    2020年CKA考试分享
    vue-element-loading 动态插件
    pycharm之常用插件
    PHP开源项目之YOURLS
  • 原文地址:https://www.cnblogs.com/leraine/p/7606288.html
Copyright © 2011-2022 走看看