SOURCE

function intrudeOnPrototype(Class, handler) {

    const original = Object.getPrototypeOf(Class.prototype)
    const target = Object.create(original)
    const { proxy, revoke } = Proxy.revocable(target, handler)
    Object.setPrototypeOf(Class.prototype, proxy)
    return () => revoke(Object.setPrototypeOf(Class.prototype, original))
}

var str = new String('OldString')

var recovery = intrudeOnPrototype(String, {
    get(target, prop) {
        if (prop === 't') return 100;
        return Reflect.get(...arguments)
    }
})

var str2 = new String('NewString')

// recovery()


// console.log(str.t)
// console.log(str2.t)

var x = 'outer', y = 'outer'

function foo() {
    console.log(x, y)
    if (true) {
        function x() { }
    } else {
        function y() { }
    }

    console.log(x, y)
}

foo()

var a = 1

function aa() {
    if (true) {
        console.log(a)
        var a = 2
        console.log(a)
    }
}
aa()
console.log(a)
console 命令行工具 X clear

                    
>
console