检测 Math 对象是否被 Proxy 拦截。(如果有打印 hooked,期望得到 true ;没有则 false )
在线代码: https://jsfiddle.net/8sdugz9r/
答案有多个,当然越简单越好~

1
meepo3927 Nov 20, 2018
if (Math.random() < 0.5)
是何作用 ? |
3
ljbha007 Nov 20, 2018
试了很多办法 都不行
|
6
chairuosen Nov 20, 2018
抖个机灵:
``` else{ return false } return true ``` |
7
page470075640 Nov 20, 2018
```
if (Math.random() < 0.5) { console.log('hooked') self.Math = new Proxy(Math, { get(obj, prop) { return obj[prop] } }) } else { return false } return true function self() {} ``` |
8
themostlazyman Nov 20, 2018
self.Math.random = () => {
return 1; } |
9
autoxbc Nov 20, 2018 function bomb()
{ try { return bomb() } catch(err) { try { Math.PI return false } catch(err) { return true } } } console.log( bomb() ) |
10
TomatoYuyuko Nov 20, 2018
@autoxbc #9 666 这是什么蛇皮操作?为啥爆栈之后 err 打印不出来了,而且为啥有代理π会报错,看不懂 QAQ
|
11
autoxbc Nov 20, 2018 @TomatoYuyuko #10
Math 真身和代理的区别是代理多一次 getter 函数调用 所以先填满栈,再去访问 Math.PI ,失败说明被代理,成功说明是静态对象 思路来自楼主的上一贴 https://www.v2ex.com/t/509253 |
13
eggggger Nov 20, 2018 function hasProxy(obj) {
Object.defineProperty(obj, 'self', { get: function() { return this } }) return obj.self !== obj } |