day55-uncurrying

背景

让对象借用原本不属于他的方法,我们可以用call,apply把任意对象当做this传入某个方法。有没有能够把this提取出来,并得到更广的适用性?


uncurrying 实现

  • 实现方式之一

    Function.prototype.uncurrying = function () {
    let self = this
    return function () {
    let obj = Array.prototype.shift.call(arguments)
    return self.apply(obj, arguments)
    }
    }
  • 实现方法二

    Function.prototype.uncurrying = function () {
    let self = this
    return function () {
    return Function.prototype.call.apply(self, arguments)
    }
    }

uncurrying应用

通过uncurrying方式,push 函数的作用和Array.prototype.push.call()一样

  • 方法一的应用

    let push = Array.prototype.push.uncurrying()
    let obj = {
    'length': 1,
    '0': 1
    }
    push(obj, 2)
    console.log(obj)
  • 发生了什么?

    Function.prototype.uncurrying = function () {
    let self = this // self 此时是Array.prototype.push()
    return function () {
    let obj = Array.prototype.shift.call(arguments)
    /**
    * obj是{
    * 'length': 1,
    * '0': 1
    * }
    * argument 对象的第一个元素被截去,剩下[2]
    */
    return self.apply(obj, arguments)
    }
    }

参考

[1].《JavaScript设计模式与开发实践》- 曾探

文章作者: lmislm
文章链接: http://lmislm.com/2019/03/07/2019-03-07/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog