js-设计模式-再看非柯里化-泛化应用

非柯里化-this泛化应用-即借用其他对象的方法来让自己也能使用该方法。
对象借用Array的push方法来实现对象的push

Function.prototype.unCurrying = function () {
  var self = this; // Array.prototype.push
  return function () {
  	// 首先理解代码意图:这段代码主要作用是将第一个参数作为this,其他参数作为入参,最后形成this.push('入参')的效果。
    // 再分析代码:分两段走
    // 1. Function.prototype.apply(Array.prototype.push, [obj, 2]) => 
    // (1)call指向 Array.prototype.push, (2)[obj, 2]:对参数进行绑定
    // 2. Array.prototype.push.call(obj, 2) => 代入并转换结果为:obj.push(2)
    // 最后总结:以下写法称为解绑定器,意思是传入的值是多个,通过apply绑定为数组,再传到call解绑为this和其他参数。
    return Function.prototype.call.apply(self, arguments);
  }
}; 
let push = Array.prototype.push.unCurrying()
let obj = {
  length: 1,
  0: 1
}
push(obj, 2, 3)
console.log(obj)

// 更多应用:重写Array方法,使之适用对象
Array.from(['unshift','push', 'shift', 'forEach']).forEach(fn => {
  Array[fn] = [][fn].unCurrying()
})

Array.forEach(obj, item => {
  console.log(item) // 1,2,3
})

// 对象的方法更长
Object.values(obj).forEach(item => {
  console.log(item)
})

Array.shift(obj)
console.log(obj) // 2,3

Array.unshift(obj, 100)
console.log(obj) // 100,2,3


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值