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

javascript:通过原型向方法添加行为-渗透代码,javascript,methods,interceptor,control-flow,modifier,Javascript,Methods,Interceptor,Control Flow,Modifier,我们有以下情况,我们使用一个库来加密东西,我想知道我们是否可以在加密之前更改参数。我可以轻松做到这一点: MyEncoder.prototype.encode=(值)=>{//按我想要的方式更改它} 但是,在我改变它之前,我该怎么做才能让它像以前一样呢?(我知道!!!) 这不起作用:var encoder=MyEncoder.prototype.encode因为它只复制方法,所以它不会有这个,而且,您知道 如果我能调试encode方法。那会有帮助的 编写一个立即调用的函数表达式(IIFE),它1

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

MyEncoder.prototype.encode=(值)=>{//按我想要的方式更改它}

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

这不起作用:
var encoder=MyEncoder.prototype.encode
因为它只复制方法,所以它不会有
这个
,而且,您知道

如果我能调试
encode
方法。那会有帮助的

编写一个立即调用的函数表达式(IIFE),它1-stly在它创建的闭包中保留原始原型
encode
功能,2-ndly返回您自己的
encode
实现,该实现现在控制传递的参数和原始
encode
的返回值。因此,我们在方法修饰符附近写了一种

MyEncoder.prototype.encode=(函数/*create_-ound_-modifier*/(proto_-encode){
返回函数/*修改的_encode*/(…argsArray){
//-拦截数据流。。。
//…例如,查看或更改传递的参数。
//…执行**之前的**部分。
//-调用/调用原始编码。。。
//
//调用原始“encode”后返回值。
const result=proto_encode.apply(这是argsArray);
//-拦截数据流。。。
//…例如,查看、处理或更改结果。
//…执行**后**部分。
//
//-不要忘记返回值。
};
}(MyEncoder.prototype.encode));
实际示例,比:

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主要用于处理这种场景


谢谢大家。

试试这个
MyEncoder.prototype.original\u encode=MyEncoder.prototype.encode
不要对方法使用箭头函数!使用真正的
函数
,其中
this
可用,您可以
.call()
使用正确的this参数调用原始方法。。。。至于OP的根本问题是方法修改。。。有一天,除了
Function.prototype.bind
之外,还应该有对
Function.prototype[before | after | around | afterhrough | afterFinally]等方法修饰符的原生支持
,为此类任务提供防弹的抽象级别。。。。嗯,差不多了。由于
stringify
是一个固定在
JSON
命名空间上的静态方法,因此它的实现不依赖于/中继任何绑定的
上下文。至于你的例子,
.apply(null,args)
也一样好。这就是我觉得奇怪的地方。我想我可能需要一些时间来研究JS lol中的名称空间。谢谢