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

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

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