2012-06-08 2 views
19

Можно создать дубликат:
Javascript use variable as object nameJavascript: интерпретировать строку как ссылку на объект?

Как получить JS для лечения строки в качестве ссылки на ранее определенный объект? Упрощено:

var myObject = new MyObject(); 

var myString = "myObject"; 

var wantThisToWork = myString.myproperty; 
+1

Если это то, что вы думаете, что нужно, то не использовать переменные для хранения. Храните 'myObject' внутри другого объекта, используемого в качестве глобального пространства имен. 'var my_namespace = {}; my_namespace.myObject = new MyObject(); var myString = "myObject"; var itWorks = my_namespace [myString] .myproperty' –

+0

@amnotiam Мой ответ детализирует ваш комментарий, трудно понять его из комментария. –

+0

@ j08691 Принятый ответ на этот пост очень хакерский. Я бы не использовал его. –

ответ

6

Единственный способ, как мне кажется, использовать eval. Но, как говорится, eval - зло, но не в контролируемой среде. Это возможно, но я не рекомендую использовать eval, если это абсолютно необходимо.

var myObject = new MyObject(); 
var myString = "myObject"; 
var wantThisToWork = eval(myString).myproperty; 
+0

и для чего это было downvote? не говорите мне из-за eval. Я уже упоминал, что я не рекомендую его, если это абсолютно необходимо. –

+1

Я не думаю, что это заслуживает понижения. Бывают случаи, когда вы должны использовать 'eval' (если вы пытаетесь получить доступ к локальной переменной). –

+0

точно! И этим выражением я не имею в виду, что ситуация с ОП (интересно, что такое полная форма ОП) - это тот, где это необходимо. Но, кроме того, что я повторяю это несколько раз, которые не используют eval без необходимости, для чего этот downvote? –

7

Вы можете использовать функцию eval.

eval(myString).myproperty 

Осторожнее с Eval, хотя, если это то, что пользователь ввода, он будет выполнять любой код яваскрипта!

+0

Есть лучшие способы (упомянутые выше), не используйте 'eval', если вам не нужно –

+0

Да, я знаю, что eval не следует использовать, если это абсолютно необходимо, и я только что видел их. Не знал об этом! +1 к этим ответам. – sachleen

23

Если переменная находится в глобальной области видимости, вы можете получить доступ к нему как свойство глобального объекта

var a = "hello world"; 
var varName = "a"; 
console.log(window[varName]); // outputs hello world 
console.log(this[varName]); // also works (this === window) in this case 

Однако, если это локальная переменная, единственный способ заключается в использовании eval (disclaimer)

function() { 
    var a = "hello world"; 
    var varName = "a"; 
    console.log(this[varName]); // won't work 
    console.log(eval(varName)); // Does work 
} 

Если вы не можете поместить свои динамические переменные в объект и получить доступ к нему как свойство

function() { 
    var scope = { 
    a: "hello world"; 
    }; 
    var varName = "a"; 
    console.log(scope[varName]); // works 
} 
+0

приятный информация.Я немного смущен тем, почему мы не можем использовать ключевое слово 'Function' в этом случае. http://stackoverflow.com/questions/36078655/extract-call-javascript-function-defined-in-the-onclick-html-attribute-of-an-e –

+0

@ techie_28 Вы можете, вы просто должны быть осторожно выполняйте произвольный код, как 'eval'. Как правило, лучше избегать его, если это возможно. –

+0

'Функция (onclickB.replace (" p, q "," p, q, r "))' это отлично работает, когда 'onclickB' имеет форму' return someFunc (2, 'abc') ', но когда я извлекайте только имя функции, то есть когда 'onclickB = 'someFunc'', передавая его в' Function (onclickB) .call (....) 'не вызывает функцию & дает ошибку .. я делаю что-то глупо здесь? –

4

Использование Eval()

var myObject = {}; 
myObject.myproperty = "Hello"; 
var myString = "myObject"; 

var wantThisToWork = eval(myString).myproperty; 
+3

не были множественными ** eval ** ответов достаточно? Это именно то, что я дал. –

+1

Не пересказывайте существующие ответы, уже было 3 ответа, например, ваш, когда вы его добавили. Не добавлено никакого значения для сообщения. –

+0

@ParthThakkar: Пока я писал свой ответ и время, когда я его разместил, уже было много ответов. Некоторое, как уведомление о уже отправленном ответе не появилось (медленный интернет). Что заставило вас думать, что меня интересует то, что вы написали? – Anand

Смежные вопросы