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')
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