共计 1850 个字符,预计需要花费 5 分钟才能阅读完成。
一个阳光明媚的周末,透光的窗帘把我从睡梦中叫醒,大脑说明天是周六,能够慵懒个一上午,于是开心地关上我的 Mac 筹备看两集 Rick and Morty 再起床洗漱。
我急不可待关上了对应的网站,发现浏览器提醒 No internet,这才发现因为我的动作太过于行云流水,电脑还没来得及连上 wifi
于是我决定重温一下这款经典的游戏。
科普:Chrome 浏览器是 Google 家的官网浏览器,应用体验全世界南波万。当用户在无网络时拜访某一网址,浏览器会提醒“无网络链接”(也就是下面这张图),按下空格键,就会唤醒一个小恐龙跑步刷分的游戏。
如果在有网络连接时也想玩的话,能够间接在地址栏输出:chrome://dino
出于职业自身的敏感和好奇,我忽然心生疑难:这应该是用 JS 做的吧?
我趁势关上控制台,不如先看一下所有的全局变量?
太多了,我可没这个急躁 …
我进行了操作,开始思考这所有的可行性:
- 我在干什么?尝试自定义这个游戏
- 为什么要看全局变量?因为假如对于游戏的对象被裸露在了全局
- 如果没裸露在全局?行,那我就放弃了(周末的晚上我可不想在 sources 外面扒源码)
也就是说,如果没有在全局变量里找到那个对象,我就能够选择性放弃了。
再看一下下面这张图,不难发现,这 251 个全局变量,有很多都是老朋友了,name、history、location、onclick、onerror… 这些变量显著和这只小恐龙没啥关系,打印进去纯正是来充个数,还节约了我找指标的工夫,所以我遇到了第一个问题:如何疾速找到由开发者自定义的全局变量?
如果我有一个失常的 window… 不对,不必如果,新开一个空窗口不就得了!
在新关上窗口的控制台,我失去了这样的后果:
也就是说,在这个恐龙快跑的小游戏里,Google 的前端工程师向 window 注入了 最多 55 个全局变量(251-196)…
为什么说最多 55 个?因为 Chrome 的版本以及装置的 Chrome 插件都会影响全局变量的个数,比方 React 开发者工具就会向 window 中注入两个全局变量。
于是问题来到了:怎么把这 55 个被注入的全局变量拿过去呢?复制粘贴之后再一个一个比对?太 low 了,让我想想 …
在原有窗口的根底上,再搞一个新窗口 … 这不就是 iframe 吗!iframe 尽管没有 window,然而它有 contentWindow,原则上来说,属性差异应该不大。所以当初只须要创立一个 iframe,拿它外面 contentWindow 的全局变量去过滤以后 window 的全局变量,就能够筛选出那多余的 55 个“嫌疑人”了。
思路有了,写代码也就容易多了:
在控制台输出这些代码后会车,我失去了这样的后果:
这下筛选出了 45 个全局变量。
45 个总比 200 多个好找一些,关上这个数组,我发现了一个命名很可疑的家伙:
Runner,不就是那个“奔跑着的小恐龙”吗(坏笑)?
那就看看它到底是个什么货色!
emmm 竟然是函数,哦?函数,首字母还大写,这相熟的滋味,这不就是个构造函数吗!正所谓,构造函数的宝藏都在 prototype 里,在察看了一遍这个宝藏之后,我发现了一个名为 gameOver 的办法,
这个函数名,难不成它就是那个 让小恐龙去死的办法 ?既然这样,呵,我反手就把它 用空函数笼罩 了。于是 …
真的是 …
而后我又发现了另一个乏味的办法:
顾名思义,这是用来 给小恐龙设置奔跑速度 的办法,然而怎么调用呢?由构造函数创立的实例对象,可通过原型链拜访构造函数 prototype 上的变量和办法,也就是说,如果能找到这个小恐龙对应的实例,那么就能间接调用这个 setSpeed 办法了。既然 Google 的前端工程师曾经把这么多变量搞到全局了,那么 … 会不会也在全局存储了这个小恐龙实例?我从新扫视了一遍那 43 个多进去的全局变量,并没有找到。我下意识地顺手输出了一下这个 Runner 构造函数,真是山重水复疑无路柳暗花明又一村呐:
我甚至都不须要看 Runner 函数的全副代码,就晓得原来实例被保留在一个名叫 instance_ 的 Runner 本身属性里,论起好变量名的重要性,行,那我就不客气了,间接调用!
于是乎 …
当我凝视着这个飞奔的无敌小恐龙时,我忽然感觉 … 所有变得 …
最初
因为思否在写文章的时候不能间接贴视频,所以前文的三个成果展现我都是用的 gif 图片代替,然而因为没有音效(没错,我本人配的)会少了很多的趣味,如果想要取得 原版更骚气的浏览体验 , 欢送点击 这个传送门(获取更加残缺的浏览体验)。