【问题标题】:How to modify all references to anonymous function如何修改对匿名函数的所有引用
【发布时间】: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


【解决方案1】:

试试这个。这样 obj2.name 也是一个函数。

如果您希望 obj2.name 成为一个属性,那么在 obj1.name 被更改后,您将需要一些东西来监视它并更新 obj2.name。所以它可能更容易使用方法。

let obj1 = {
    name: function() { return 'original'; }
}
let obj2 = {
    name: function() { return obj1.name() }
}

【讨论】:

  • 我解释得不够充分,obj1 和 obj2 的声明都是原始代码的一部分,我想修改具有该特定声明的函数。
  • 啊你的意思是这样 const someFunction = () => {} let obj1 = { name : someFunction} let ob2 = { name : someFunction } someFunction = () => { console.log( “做点别的”}
  • 没错!问题是我的函数是匿名的,所以我不能(或不知道如何)直接修改它
【解决方案2】:

好的,我知道了,每次调用 obj1.name() 时,它都会获取当前当前的 someFunction 的哪个版本,而不是分配一次就不再检查


let someFunction = () => "original"

let obj1 = {
  name:  () => someFunction()
}

let obj2 = {
  name:  () => someFunction()
}

console.log(obj1.name())
console.log(obj2.name())

someFunction = () => "edited"

console.log(obj1.name())
console.log(obj2.name())



【讨论】:

  • 好的,返回函数的附加函数根本不需要
  • 感谢您的帮助,这是个好主意,但我仍然不能那样修改函数,因为在我的情况下,函数没有名称 (function(){...)
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 2016-08-31
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多