大家都手写bind,那我就手写个apply吧

本文介绍了一种自定义函数applyFn的方法,通过使用Symbol确保属性名的唯一性,避免了覆盖目标对象已有属性的问题。该方法实现了类似Function.prototype.apply的功能,但增强了健壮性和安全性。

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

    Function.prototype.applyFn = function (targetObject, argsArray) {
      if (typeof argsArray === 'undefined' || argsArray === null) {
        argsArray = []
      }

      if (typeof targetObject === 'undefined' || targetObject === null) {
        targetObject = window
      }

      targetObject = new Object(targetObject)

      const targetFnKey = Symbol()    // 防止属性名重复
      targetObject[targetFnKey] = this

      const result = targetObject[targetFnKey](...argsArray)
      delete targetObject[targetFnKey]
      return result
    }

测试下结果:

    const obj = {
      a: 1
    }
    var a = 2
    function logA() {
      console.log(this.a)
    }
    logA()  // 2
    logA.apply(obj) // 1
    logA.applyFn(obj) // 1

        代码不难,函数体内this指向调用applyFn的函数。为了将该函数体内的this绑定在targetObject上,此处采用了隐式绑定的方法:targetObject[targetFnKey](...argsArray)。

        这里存在一个问题:如果targetObject对象本上有targetFnKey这样的属性,那么在使用applyFn函数时,原有targetFnKey属性值就会被覆盖,之后被删除。解决方案是使用ES6 Symbol()来保证键的唯一性,或者使用Math.random()实现独一无二的键,此处采用的是使用symbol()来处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值