利用Proxy,可以将读取属性的操作(get)转变为执行某个函数,从而实现属性的链式操作。
var pipe = (function() {
return function(value) {
var funcStack = [];
var oproxy = new Proxy({}, {
get: function(target, propKey) {
// 先判断是不是get操作,不是的话,将其放在方法堆funcStack中,是的话,调用
if (propKey === 'get') {
// 调用reduce加法,将每一个方法的返回值给累加起来,
// 参数为什么是(value,func)跟箭头函数的写法有关
return funcStack.reduce(function(value, func) {
return func(value);
}, value);
}
// 将方法先放入方法堆funcStack中
funcStack.push(window[propKey]);
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;