问题标签 [proxy-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
334 浏览

java - 如何在 Java 中跟踪方法结果

简而言之,我正在开发一个系统,该系统能够为您提供有关执行 java 程序所提供的结果的信息。考虑过下面的问题,不知道能不能用java解决。

我有以下课程:

到目前为止,我可以通过使用动态代理来捕获方法的每次调用。特别是,我使用包 java.lang.reflect 中的代理和 InvocationHandler 对象。这是我遵循的示例(https://www.concretepage.com/java/dynamic-proxy-with-proxy-and-invocationhandler-in-java)。

我的问题是,如果有人知道我如何提供诸如:“method1() 的返回是从 method2() 的返回生成的,而 method2() 的返回又是从 method3() 的返回生成的, method4() 的返回”。

0 投票
0 回答
211 浏览

c++ - 使用按返回类型实现运算符重载的代理模式?

答案中,@James Kanze 按返回类型显示了运算符重载的实现,如下所示:

然后我在没有代理的情况下实现自己的:

我不明白为什么要使用代理?

我知道 Proxy 是一种设计模式,但无论如何我都想不出我必须在这里使用这样的设计模式。

任何人都可以使用具体的例子证明代理是必须的吗?

0 投票
2 回答
924 浏览

javascript - 代理扩展 HTMLElement 的 WebComponent 的构造函数

因此,在我创建的使用自定义元素的库中,您显然需要在CustomElementsRegistry实例化它之前定义类。

截至目前,这正在通过装饰器解决:

这可行,但是,我想在类的实例化时自动注册自定义元素(这样作者就不必将装饰器添加到他们编写的每个组件中)。这可以通过Proxy.


但是,我的问题是,当我尝试在构造函数上使用 Proxy 并尝试返回目标实例时,我仍然得到Illegal Constructor,就好像该元素从未在注册表中定义过一样。

这显然与我在代理内部实例化类的方式有关,但我不确定如何做到这一点。我的代码如下:

请在最新的 Chrome 中运行:

MyElement我怎样才能继续代理内部的继承链,而不会丢失我正在实例化类以使其不会引发Illegal Constructor异常这一事实的上下文?

0 投票
1 回答
403 浏览

javascript - 构造函数调用绑定函数的代理

假设我有一个 function Foo,并且我希望从它构造的对象具有一个bar属性:


现在假设我以某种方式绑定 Foo。绑定函数仍然可以在构造函数调用中使用,并且绑定this被忽略:


代理应该是通用和透明的。然而...


我希望第二个代理的行为与 完全一样Bound,因为我使用的是空处理程序。换句话说,我希望最后一个输出是baz.

为什么不是这样?

(完整的片段如下)

0 投票
1 回答
1947 浏览

swift - 在 Swift 4.1 中使用 NSProxy

NSProxy如何在 Swift中创建子类?

尝试添加任何init方法都失败并出现错误:“无法在初始化程序之外调用超级初始化”,或“在从初始化程序返回之前未在所有路径上调用超级初始化”

错误1 错误2

使用 Objective-C 子类作为基类是可行的,但感觉更像是一种 hack:

0 投票
2 回答
227 浏览

javascript - ES6 代理 - 是否可以在调用空对象之前捕获方法?

我正在使用一个 API,该 API 在用户提交数据之前返回用于验证表单的模式。

例如,该模式有一个User具有名为 的属性的类email。如果有错误,则User.validators.getEmailErrors()返回Array所有错误中的一个,例如['Email address cannot be blank', 'Email addresses must match']

但是,如果该字段有效且未发现错误,则getEmailErrors()返回null

在我的应用程序中,我想安全地链接更多方法getEmailErrors(),例如getEmailErrors().join(','),但不事先检查null。相反,有没有办法(例如使用 ES6 代理)来getEmailAddress()了解它是否会返回一个Array,并安全地忽略任何方法join(),例如它返回的情况null

Array简单的解决方案是在有效的情况下返回一个空而不是null,但假设我无法更改它。

0 投票
2 回答
1110 浏览

javascript - 混合构造函数并在 Javascript 代理对象上应用陷阱

我有一个要应用代理的类,观察方法调用和构造函数调用:

计算器.js

index.js

调用此方法时,我希望输出为:

对象实例化

方法调用

但是,apply 没有被调用,我认为这是因为我将代理附加到 Calculator 类,而不是实例化的对象,因此不知道apply陷阱。

我如何构建一个包罗万象的代理来“观察”方法调用和构造函数调用。

0 投票
2 回答
254 浏览

javascript - 在 JavaScript 中实现代理时将方法委托给父级

Node.js 设计模式的示例中

当原型链已设置时将自动调用来自原始对象的方法时, 方法委托需要重新定义Proxy.prototype.goodbye方法,即Proxy.prototype = Object.create(proto)。提前致谢。

0 投票
1 回答
201 浏览

c++ - 对于代理容器上的迭代器来说,什么是“最糟糕的实现”?

语境

我试图实现一个像容器一样的 nD 数组。可以包装底层序列容器并允许将其作为容器容器处理的东西 (of...):arr[i][j][k]应该是_arr[(((i * dim2) + j) * dim3) + k].

好的,直到那里,arr[i]只需成为子数组的包装类......

当我尝试实现交互器时,我突然意识到周围到处都是龙:

真正的问题是,一旦你有一个代理容器,没有迭代器可以遵守前向迭代器的以下要求:

前向迭代器 [forward.iterators]
...
6如果ab都是可解引用的,那么a == b当且仅当*a*b绑定到同一个对象。

示例来自标准库本身:

  • vector<bool>众所周知,它不尊重容器的所有要求,因为它返回代理而不是引用:

    类向量 [vector.bool]
    ...
    3不要求将数据存储为 bool 值的连续分配。建议使用空间优化的位表示。
    4引用是模拟向量中单个位的引用行为的类。

  • 文件系统路径迭代器被称为存储迭代器:

    path iterators [fs.path.itr]
    ...
    2 path::iterator 是一个常量迭代器,它满足双向迭代器 (27.2.6) 的所有要求,除了对于可解引用的迭代器ab带有 的 path::iterator 类型a == b,不要求*a*b绑定到同一个对象。

    并来自cppreference

    注意: std::reverse_iterator 不适用于返回对成员对象的引用的迭代器(所谓的“存储迭代器”)。存储迭代器的一个例子是 std::filesystem::path::iterator。

问题

我目前找到了很多关于为什么代理容器不是真正的容器以及如果标准允许代理容器和迭代器会很好的参考资料。但我仍然不明白什么是最好的,什么是真正的限制。

所以我的问题是为什么代理迭代器真的比存储迭代器更好,以及它们中的任何一个都允许哪些算法。如果可能的话,我真的很想为这种迭代器找到一个参考实现

作为参考,我的代码的当前实现已在Code Review上提交。它包含一个存储迭代器(当我尝试使用时立即中断std::reverse_iterator

0 投票
0 回答
115 浏览

python - 带有猴子补丁方法的实例代理

我需要一种方法来为具有猴子修补方法/字段的实例创建“代理”。

  • 我不想使用上下文管理器和/或直接修改实例。
  • 我不能使用继承——我得到了一个实例,就是这样。

你知道任何使它成为可能的包吗?

这是我非常粗略的尝试,显示了我需要的功能: