SOURCE

//代理demo
/*var obj = new Proxy({}, {
    get: function (target, key, receiver) {
        console.log(`getting ${key}!`);
        return Reflect.get(target, key, receiver);
    },
    set: function (target, key, value, receiver) {
        console.log(`setting ${key}!`);
        return Reflect.set(target, key, value, receiver);
    }
});
obj.count=1;
++obj.count;
console.log(obj.coount);*/

//设置拦截
/*var handler = {
    get: function (target, name) {
        if (name === 'prototype') {
            return Object.prototype;
        }
        return `Hello, ${name}`;
    },
    apply: function (target, thisBinding, args) {
        return args[0];
    },
    construct: function (target, args) {
        return { value: args[1] };
    }
};
var fproxy = new Proxy(function (x, y) {
    return x + y;
}, handler);
console.log(fproxy(1, 2));   //1
console.log(new fproxy(1, 2));   //{value:2}
console.log(fproxy.prototype === Object.prototype); //true
console.log(fproxy.foo === 'Hello, foo'); //true*/

//get拦截,实现数组读取负数的索引。
/*function createArray(...elements) {
    let handler = {
        get(target, propKey, receiver) {
            let index = Number(propKey);
            if (index < 0) {
                propKey = String(target.length + index);
            }
            return Reflect.get(target, propKey, receiver);
        }
    };

    let target = [];
    target.push(...elements);
    return new Proxy(target, handler);
}
let arr = createArray('a', 'b', 'c');
console.log(arr[-1]);*/

//链式操作
var pipe = (function () {
    return function (value) {
        var funcStack = [];
        var oproxy = new Proxy({}, {
            get(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;
console.log(pipe(3).double.pow.reverseInt.get); //63
console 命令行工具 X clear

                    
>
console