非柯里化-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