Возможна ли в JavaScript «динамическая» ссылка на объект на основе имени родительского свойства? - PullRequest
2 голосов
/ 19 апреля 2019

Очень уверен, что это дубликат, но я не знаю, что искать. Поэтому, пожалуйста, потерпите меня ...

В приведенном ниже примере это выглядит так: childRef указывает на исходный объект, назначенный на someParentObj.someChildObj, и поэтому, когда someParentObj.someChildObj назначается новому объекту, childRef все еще ссылается на исходный объект.

Есть ли способ присвоить childRef, чтобы он отражал новый объект, как только он назначен на someParentObj.someChildObj? (Я спрашиваю это в основном из любопытства, но в некоторых случаях это может позволить более короткий код и пригодится.)

var someParentObj = {
    someChildObj: {originalChildProp: ['some', 'array']}
};

window.parentRef = someParentObj;
window.childRef = someParentObj.someChildObj;

someParentObj.someChildObj = {differentChildProp: ['other', 'array']}


console.log(parentRef.someChildObj)
// Output: {differentChildProp: Array(2)}

console.log(childRef) 
// Output: {originalChildProp: Array(2)} but I would like to have the new/different
// object on parentRef.someChildObj. Is it possible?

1 Ответ

2 голосов
/ 19 апреля 2019

Опция, которая может работать в этой конкретной ситуации , поскольку вы хотите присвоить свойству window, это сделать window.childRef getter , который возвращает someParentObj.someChildObj:

var someParentObj = {
    someChildObj: {originalChildProp: ['some', 'array']}
};

window.parentRef = someParentObj;
Object.defineProperty(window, 'childRef', { get() { return someParentObj.someChildObj }});

someParentObj.someChildObj = {differentChildProp: ['other', 'array']}

console.log(parentRef.someChildObj)
console.log(childRef)

Если вы не присваивали свойству объекта, например, если childRef была автономной переменной с областью действия блока, а не глобальнойобъект, это не было бы возможно.Поэтому, если вы хотите использовать шаблон такого типа, всегда используйте объект.

Вы также можете использовать прокси, если можете манипулировать ссылкой на базовый объект (например, если вы не работали с window), которая может выполнять в основном то же самое, но она более сложная и менее поддерживаемая.

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