zoukankan      html  css  js  c++  java
  • 手写call、apply、bind

    call

    Function.prototype.myCall = function(context){
    if(typeof this !== 'function'){//调用myCall的函数
    throw new TypeError('error')
    }
    context = context||window //传入的第一个对象存在么,不存在就指向window
    context.fn = this //给context对象添加一个fn函数,这样,我们调用的那个函数的指向就编程context了
    const args = [...arguments].slice(1)//把myCall的参数处理一下,去掉context,剩下的就是我们传入的参数
    const result = context.fn(...args)
    delete context.fn//删除context对象的fn属性,为了别的函数再调用
    return result //返回该函数
    }

    apply

    Function.prototype.myApply= function (context) {
    if(typeof this!== 'function'){
    throw new TypeError('error')
    }
    context = context||window
    context.fn = this
    let result
    if(arguments[1]){ //如果调用myApply的函数传参了,就解构再传值,否则直接调用就完了
    result= context.fn(...arguments[1])
    }else{
    result = context.fn()
    }
    delete context.fn
    return result
    }

    bind

    Function.prototype.mybind = function(context){
    if(typeof this!=="function"){
    throw new TypeError('error')
    }
    const that = this
    const args = [...arguments].splice(1)
    return function F(){
    if(this instanceof F){//如果这个函数是构造函数,this指向就是实例化对象,否则指向的就是context
    return new that(...args,...arguments);
    }
    return that.apply(context,args.concat(arguments))
    }
    }

  • 相关阅读:
    bzoj2006[NOI2010]超级钢琴
    bzoj1088[SCOI2005]扫雷
    bzoj1207[HNOI2004]打鼹鼠
    bzoj2132圈地计划
    bzoj2127happiness
    bzoj1037[ZJOI2008]生日聚会
    bzoj1031[JSOI2007]字符加密
    bzoj1566[noi2009]管道取珠
    bzoj2134单选错位
    vuejs之v-on小例子之实现购买数量的增加和减少
  • 原文地址:https://www.cnblogs.com/lyly96720/p/12110105.html
Copyright © 2011-2022 走看看