利用 Proxy,可以将读取属性的操作(get),转变为执行某个函数,从而实现属性的链式操作。
设置 Proxy 以后,达到了将函数名链式使用的效果
var pipe = function (value) {var funcStack = [];var oproxy = new Proxy({} , {get : function (pipeObject, fnName) {if (fnName === 'get') {return funcStack.reduce(function (val, fn) {return fn(val);},value);}funcStack.push(window[fnName]);return oproxy;}});return oproxy;
}var double = n => n * 2;
var pow = n => n * n;
var reverseInt = n => n.toString().split("").reverse().join("") | 0;pipe(3).double.pow.reverseInt.get; // 63
console.log(pipe(3).double.pow.reverseInt.get) // 63
经过打断点,在控制台看执行过程:
执行过程是从左到右的;
上述函数执行过程,value为3会一直在,并不会被销毁(不足为奇哈)。
proxy在pipe(3):生成一个proxy并且将其返回后,后续的属性操作都走proxy的handler了
数组的reduce方法
reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,
每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。第一次执行回调函数时,不存在“上一次的计算结果”。
如果需要回调函数从数组索引为 0 的元素开始执行,则需要传递初始值。
否则,数组索引为 0 的元素将被作为初始值 initialValue,
迭代器将从第二个元素开始执行(索引为 1 而不是 0)。
参数
callbackFn
一个“reducer”函数,包含四个参数:
initialValue 可选
返回值
使用“reducer”回调函数遍历整个数组后的结果。
上一篇:ARM术语