手写call

文章介绍了JavaScript中`call`方法的应用,如何在person对象的getName方法中通过`call`将this指向修改为man对象,以及手写call方法的实现原理,确保函数执行时正确的this上下文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用原生的call

 var person = {
      getName() {
        // this指向person
        console.log(this);
        return this.name
      }
    }

    var man = {
      name: '小余'
    }
    // 把this指向修改为man
    person.getName.call(man)

使用手写call

   var person = {
      getName() {
        console.log(this);
        return this.name
      },
    }

    var man = {
      name: '小余'
    }

    // 手写call方法
    Function.prototype.myCall = function (content) {
      //在JavaScript中,如果this没有被正确设置,它会默认指向全局对象(在浏览器中为window对象)
      // 所以getName中打印的this为window
      // this()

      // 如果this现在则为getName()不是一个函数则抛出一个错误提示
      if (typeof this !== "function") {
        throw new Error('这不是一个函数')
      }

      // 不传入形参则为window
      content = content || window

      // 传入多个形参,把除了第一个content其余都赋值给args
      const args = [...arguments].slice(1)

      // 将getName即this赋值给content.fn设为新函数 此时this指向为content即man
      content.fn = this

      // 将参数传给getName()
      const res = content.fn(args)
      // 添加新属性需要删除,防止产生冲突
      delete content.fn

      return res
    }
    
    person.getName.myCall(man)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值