Как изменить все ссылки на анонимную функцию - PullRequest
3 голосов
/ 17 июня 2020

Можно ли изменить все ссылки на анонимную функцию так, чтобы вызовы из других объектов отражали изменения?

Ниже приведен пример ситуации, когда obj1.name и obj2.name указывают на одно и то же функция, но поскольку функция передается по значению при создании obj2.name = obj1.name, изменения в obj1.name не влияют на 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'

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Попробуйте это. Таким образом, obj2.name также является функцией.

Если вы хотите, чтобы obj2.name было свойством, то после изменения obj1.name вам понадобится что-то, чтобы следить за этим и обновлять obj2.name. Так что, вероятно, проще использовать метод.

let obj1 = {
    name: function() { return 'original'; }
}
let obj2 = {
    name: function() { return obj1.name() }
}
0 голосов
/ 17 июня 2020

Хорошо, я понял, каждый раз, когда вызывается 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())



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...