#第五人格[超话]##第五人格公主抱#
p1p2是开局挂了我椅子,二挂突然佛系的杰克,被撞下来六次[允悲]
p3我自己自定义[偷乐]
p4是一只佳丽,最后队友走了她突然传送我的这个门(我当时在翻箱子)
p5是一只魔系杰克,我刚进游戏就发现在椅子上了[允悲]
剩下的几张是开局抓到我,抱了一局疯狂戳爆攻击键的苏苏的杰克先生[求关注][求关注][求关注]真的是戳了一局的攻击键啊[求关注][求关注]
等和朋友自定义我也戳爆攻击键[doge]
突然发现蓝色也是一种别样的美呢,不似红色那样热情,张扬,浪漫。却有一种清冷的神秘感,清而雅[求关注]俗话说的好,自古红蓝出cp嘛[doge]
(官博,看我看我,赞我赞我[doge])
p1p2是开局挂了我椅子,二挂突然佛系的杰克,被撞下来六次[允悲]
p3我自己自定义[偷乐]
p4是一只佳丽,最后队友走了她突然传送我的这个门(我当时在翻箱子)
p5是一只魔系杰克,我刚进游戏就发现在椅子上了[允悲]
剩下的几张是开局抓到我,抱了一局疯狂戳爆攻击键的苏苏的杰克先生[求关注][求关注][求关注]真的是戳了一局的攻击键啊[求关注][求关注]
等和朋友自定义我也戳爆攻击键[doge]
突然发现蓝色也是一种别样的美呢,不似红色那样热情,张扬,浪漫。却有一种清冷的神秘感,清而雅[求关注]俗话说的好,自古红蓝出cp嘛[doge]
(官博,看我看我,赞我赞我[doge])
【基于原型链劫持的前端代码插桩实践】
作者:doodlewind
链接:https://t.cn/EGsr6AG
导读
代码插桩技术能够让我们在不更改已有源码的前提下,从外部注入、拦截各种自定的逻辑。这为施展各种黑魔法提供了巨大的想象空间。下面我们将介绍浏览器环境中一些插桩技术的原理与应用实践。
插桩基础概念
前端插桩的基本理念,可以用这个问题来表达:假设有一个被业务广泛使用的函数,我们是否能够在既不更改调用它的业务代码,也不更改该函数源码的前提下,在其执行前后注入一段我们自定义的逻辑呢?
举个更具体的例子,如果业务逻辑中有许多 console.log 日志代码,我们能否在不改动这些代码的前提下,将这些 log 内容通过网络请求上报呢?一个简单的思路是这样的:
封装一个「先执行自定义逻辑,然后执行原有 log 方法的函数」。
将原生 console.log 替换为该函数。
如果希望我们的解法具备通用性,那么不难将第一步中的操作泛化为一个高阶函数:
function withHookBefore (originalFn, hookFn) {
return function () {
hookFn.apply(this, arguments)
return originalFn.apply(this, arguments)
}
}
于是,我们的插桩代码就很简洁了。只需要形如这样:
console.log = withHookBefore(console.log, (...data) => myAjax(data))
复制代码原生的 console.log 会在我们插入的逻辑之后继续。下面考虑这个问题:我们能否从外部阻断 console.log 的执行呢?有了高阶函数,这同样是小菜一碟:
function withHookBefore (originalFn, hookFn) {
return function () {
if (hookFn.apply(this, arguments) === false) {
return
}
return originalFn.apply(this, arguments)
}
}
只要钩子函数返回 false,那么原函数就不会被执行。例如下面就给出了一种清爽化控制台的骚操作:
console.log = withHookBefore(console.log, () => false)
这就是在浏览器中「偷天换日」的基本原理了。
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:doodlewind
链接:https://t.cn/EGsr6AG
导读
代码插桩技术能够让我们在不更改已有源码的前提下,从外部注入、拦截各种自定的逻辑。这为施展各种黑魔法提供了巨大的想象空间。下面我们将介绍浏览器环境中一些插桩技术的原理与应用实践。
插桩基础概念
前端插桩的基本理念,可以用这个问题来表达:假设有一个被业务广泛使用的函数,我们是否能够在既不更改调用它的业务代码,也不更改该函数源码的前提下,在其执行前后注入一段我们自定义的逻辑呢?
举个更具体的例子,如果业务逻辑中有许多 console.log 日志代码,我们能否在不改动这些代码的前提下,将这些 log 内容通过网络请求上报呢?一个简单的思路是这样的:
封装一个「先执行自定义逻辑,然后执行原有 log 方法的函数」。
将原生 console.log 替换为该函数。
如果希望我们的解法具备通用性,那么不难将第一步中的操作泛化为一个高阶函数:
function withHookBefore (originalFn, hookFn) {
return function () {
hookFn.apply(this, arguments)
return originalFn.apply(this, arguments)
}
}
于是,我们的插桩代码就很简洁了。只需要形如这样:
console.log = withHookBefore(console.log, (...data) => myAjax(data))
复制代码原生的 console.log 会在我们插入的逻辑之后继续。下面考虑这个问题:我们能否从外部阻断 console.log 的执行呢?有了高阶函数,这同样是小菜一碟:
function withHookBefore (originalFn, hookFn) {
return function () {
if (hookFn.apply(this, arguments) === false) {
return
}
return originalFn.apply(this, arguments)
}
}
只要钩子函数返回 false,那么原函数就不会被执行。例如下面就给出了一种清爽化控制台的骚操作:
console.log = withHookBefore(console.log, () => false)
这就是在浏览器中「偷天换日」的基本原理了。
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【哈雷发布量产版电动摩托车LiveWire 明年上市】总部位于威斯康星州密尔沃基的哈雷日前在意大利EICMA摩托车展上发布了这款量产版电动摩托车LiveWire,明年上市销售。LiveWire将提供7种骑行模式,其中3种是用户自定义模式。摩托车还在车把上方安装了可调的彩色触摸显示屏,让用户可以使用蓝牙、导航、音乐和其他功能。哈雷给LiveWire配备了一种新的音调,随着速度会增加音高和音量。
✋热门推荐