Quero usar o valor de uma variável para acessar um objeto.
Digamos que eu tenha um objeto chamado myobject.
Quero preencher uma variável com este nome e usar a variável para acessar o objeto.
Exemplo:
var objname = 'myobject';
{objname}.value = 'value';
javascript
PeeHaa
fonte
fonte
alert(this === window)
.window
objeto chamadoobjname
que é então referenciado viathis
... você pode substituirwindow
porthis
no segundo exemplo e tudo iria funcionar ainda. :-)arguments.callee
está obsoleto, mas é uma implementação muito inteligente, no entanto - e não desorganiza o escopo global. +1objname
como uma propriedade da própria função. Ele pode falhar para funções recursivas. Não tenho certeza de como isso pode ser usado no mundo real.Use colchetes ao redor do nome da variável.
fonte
É uma variável global? Nesse caso, eles são realmente parte do
window
objeto, então você pode fazerwindow[objname].value
.Se for local para uma função, não acho que haja uma boa maneira de fazer o que você deseja.
fonte
O objeto existe em algum escopo, então você quase sempre pode acessar a variável por meio desta sintaxe:
O único lugar onde isso fica complicado é quando você está em um escopo fechado e deseja acessar uma variável local de nível superior. Quando você tem algo assim:
Você pode contornar isso usando
eval
para acessar a cadeia de escopo atual ... mas não recomendo, a menos que você tenha feito muitos testes e saiba que essa é a melhor maneira de fazer as coisas.Sua melhor aposta é ter uma referência a um nome em um objeto que sempre estará lá (como
this
no escopo global ou uma variável de nível superior privada em um escopo local) e colocar todo o resto lá.Portanto:
fonte
Você pode usar
eval
:fonte
eval
consideradoevil
? Se não, posso usá-lo. Porque é global agora, mas eu queria movê-lo para uma função para limpar as coisas.eval
possa ser executado.eval
, em minha opinião. No entanto, precisamos ter certeza de que a variável está limpa.myVar[objname].value
?Você não pode fazer isso em geral, exceto no escopo da janela, onde você pode escrever
window[objname].value = 'value';
fonte
Acho que a resposta de Shaz para variáveis locais é difícil de entender, embora funcione para funções não recursivas. Aqui está outra maneira que eu acho mais clara (mas ainda é ideia dele, exatamente o mesmo comportamento). Ele também não está acessando as variáveis locais dinamicamente, apenas a propriedade da variável local.
Basicamente, ele está usando uma variável global (anexada ao objeto de função)
O que é essencialmente a mesma coisa que criar um global para armazenar a variável, para que você possa acessá-la como uma propriedade. Criar um global para fazer isso é um hack.
Aqui está um hack mais limpo que não cria variáveis globais; em vez disso, ele usa uma variável local.
Veja Javascript: interpretar string como referência de objeto?
fonte
Ao usar a janela [objname], certifique-se de que o objname são variáveis globais. Caso contrário, funcionará em algum momento e falhará às vezes. janela [objname] .value.
fonte
Se o objeto estiver em algum namespace, por exemplo.
Company.Module.Components.Foo
você pode usar esta função:CoffeeScript:
Js resultantes:
Então você pode criar um novo objeto ou fazer o que for. Observe os parênteses.
Esta ideia é emprestada de uma questão semelhante: Como executar uma função JavaScript quando tenho seu nome como uma string
fonte
Um dos desafios que tive com as respostas é que presumia que o objeto era um único nível. Por exemplo,
funciona bem, mas
não funciona.
O que acabei fazendo foi construir uma função para acessar objetos multinível:
No segundo cenário, então, posso passar a string para esta função para recuperar o objeto que estou procurando:
fonte
Você pode definir uma propriedade de objetos desta forma:
fonte
Se você já conhece a lista de nomes de variáveis possíveis, tente criar um novo objeto (iconObj) cujos nomes de propriedades sejam iguais aos nomes de objetos. Aqui no exemplo abaixo, a variável iconLib conterá dois valores de string, 'ZondIcons' ou 'MaterialIcons' . propertyName é propriedade do objeto ZondIcons ou MaterialsIcon.
fonte
-> [algo: {algoElse: 'teste'}];
fonte
fonte