javascript:通过原型向方法添加行为 - 渗透代码

Posted

技术标签:

【中文标题】javascript:通过原型向方法添加行为 - 渗透代码【英文标题】:javascript:add behavior to method via prototype - infiltrate code 【发布时间】:2020-05-06 20:42:05 【问题描述】:

我们有以下情况,我们使用库来加密东西,我想知道我们是否可以在加密之前更改参数。我可以轻松做到这一点:

MyEncoder.prototype.encode = (value) => //change it the way I want;

但是,在我改变它之前,我该怎么做才能让它像以前一样呢? (我知道!!!

这行不通:var encoder = MyEncoder.prototype.encode;,因为它只会复制方法,不会有 this,而且,你知道的。

如果我可以调试encode 方法。这会有所帮助!

【问题讨论】:

试试这个MyEncoder.prototype.original_encode = MyEncoder.prototype.encode 不要在方法中使用箭头函数!使用真正的function,其中this 可用,您可以在.call() 使用正确的this 参数的原始方法。 ... 至于 OP 的根本问题是 method modify ...除了@987654329 之外,应该还有一天@,对 方法修饰符 的原生支持,例如 Function.prototype[before|after|around|afterThrowing|afterFinally],为此类任务提供防弹抽象级别。 【参考方案1】:

编写一个立即调用函数表达式 (IIFE),它一方面在它创建的闭包中保留原始原型encode 功能,另一方面返回您自己的encode 实现现在控制传递的参数和原始encode 的返回值。因此,有人编写了一种 around 方法修饰符 ...

MyEncoder.prototype.encode = (function /*create_around_modifier*/ (proto_encode) 
  return function /*modified_encode*/ (...argsArray) 

    // - intercept data flow ...
    //   ... e.g. look into or change the passed arguments.

    // ... implement the **before** part.

    // - call/invoke the original encode ...
    //
    // return value after invoking the original `encode`.
    const result = proto_encode.apply(this, argsArray);

    // - intercept data flow ...
    //   ... e.g. look at, work with or change the result.

    // ... implement the **after** part.

    //
    // - do not forget the return value.
  ;
(MyEncoder.prototype.encode));

【讨论】:

【参考方案2】:

真实的例子,比:

JSON.stringify = (function (proto_method) 
  return function (...args) 
    //I can to whatever I want before original method does it's job

    return proto_method.apply(this, args);
  ;
(JSON.stringify));

鉴于 JSON 主要用于处理某种场景,因此我可以轻松更改参数,也许可以在加密之前检查已完成的操作。

谢谢大家。

【讨论】:

...好吧,差不多。由于stringify 是固定到JSON 命名空间的静态方法,因此其实现不依赖/中继任何绑定的this 上下文。至于你的例子,.apply(null, args) 也可以。 这就是我觉得奇怪的地方。我想我可能需要一些时间来研究 JS 中的命名空间,哈哈。谢谢

以上是关于javascript:通过原型向方法添加行为 - 渗透代码的主要内容,如果未能解决你的问题,请参考以下文章

javascript 向DOM元素添加行为

关于JavaScript的原型继承与原型链

JS原型+原型链+设计模式

javaScript基础

JavaScript 原型的深入指南

IE8中的JavaScript事件原型