【发布时间】:2023-04-10 13:03:01
【问题描述】:
是否可以修改对匿名函数的所有引用,以便来自其他对象的调用反映更改?
下面是一个例子,其中 obj1.name 和 obj2.name 都指向同一个函数,但是由于在创建 obj2.name = obj1.name 时函数是按值传递的,所以 obj1.name 的变化不会' t 影响 obj2.name。
在本例中,我想修改该函数,使其返回所有对象的“已编辑”。
//This two declarations are part of the original code that I cannot modify.
let obj1 = {
name: function() { return 'original'; }
}
let obj2 = {
name: obj1.name
}
// obj1.name() >> 'original'
// obj2.name() >> 'original'
// At this point, I want to modify the returned value.
obj1.name = function() { return 'edited'; }
// obj1.name() >> 'edited'
// obj2.name() >> 'original'
【问题讨论】:
-
没有。将它作为多个对象的一部分是一个糟糕的设计(正如您已经发现的那样),您应该更改它而不是试图提出一个 hacky 解决方案。
-
我很困惑。你说“这两个声明是我无法修改的原始代码的一部分”,但你在这里修改它们:
obj1.name = function() { return 'edited'; }。那么,规则是什么?如果您可以更改obj1.name,您肯定可以更改obj2.name,如当前答案中所建议的那样。 -
也许stackoverflow.com/q/2136522 会有所帮助?
-
@GerardoFurtado 我试图简化一个更复杂的情况,我有几个对象指向一个匿名函数。我想为所有可能调用它的对象修改该函数(我不知道有多少对象可能正在调用该函数,所以我必须直接攻击该函数)
-
如果对象已经存在,并且它们每个都包含自己的匿名函数,那么根据定义,除非您可以枚举该对象列表,否则您无法更改这些函数的作用。
标签: javascript prototype