2013-06-24 3 views
1

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

key(500, 'door', 10, 'bounceOut', 'regY', -150, 5, 'bounceIn'); 
function key(point, instance, speed, ease, prop, value, speed2, ease2, prop2, value2){ 
     ani.instance = true; 
     createjs.Tween.get(instance, {override: true}).to({prop: value}, -(value + -instance.prop) * speed, createjs.Ease.ease); 
    } 

Решение заявил here должно было сработать, но он ничего не делает для меня.

// ani.instance changed to: 
    ani[instance]; // no error here 
    // instance.prop changed to: 
    instance[prop]; // returns 'undefined', expected it to return 'door[regY]'. instance and prop return 'door' and 'regY' respectively though 

Что здесь происходит? Может ли кто-нибудь подтолкнуть меня в правильном направлении? Спасибо :)

EDIT То, что я хочу код, чтобы прочитать это:

door.regY = 200; 
createjs.Tween.get(door, {override: true}).to({regY: -150}, -(-150 + -door.regY) * 10, createjs.Ease.bounceOut); 
+0

Является ли намерение '{prop: value}' создавать свойство с именем 'regY'? Если это так, вам нужно «var O = {}; O [prop] = значение; 'и передать' O' –

+0

@AlexK. Не совсем. Вне этой функции 'door.regY' уже определен. Этот конкретный бит '{prop: value}' реагирует на 'get (instance, {override: true})'. Я хочу, чтобы он читал «get (door, {override: true)). ({Door: regY})' и т. Д. – AKG

ответ

1

В invokation вашей key функции, вы передаете строку в качестве аргумента instance. Таким образом, вы сможете получить доступ к свойствам строки, а не к объекту door.

Я предполагаю, что есть объект door, так как у вас, вероятно, есть такой объект где-то еще, у которого есть свойство, к которому вы пытаетесь получить доступ в key (regY в вашем примере). Вы должны называть key, как это, то:

key(500, door, 10, 'bounceOut', 'regY', -150, 5, 'bounceIn'); 

door где переменная реферирование, что другой объект. Конечно, вы не знали бы имя переменной внутри key. Если вам это тоже нужно, вам нужно передать его как другой параметр. Однако это не похоже на хорошее решение, действительно ли оно вам нужно?

+0

спасибо за ваш ответ. Я стараюсь следовать, потому что я на самом деле новичок в JavaScript и пытаюсь учиться. Итак, я не могу передать литеральную строку функции? ('instance',' prop' и т. д., действующие как заполнители) – AKG

+1

Если вы передаете строку, вам нужно где-то получить фактический объект ('door'), используя эту строку. Допустим, у вас есть все ваши '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', то вы можете получить свой экземпляр по имени, как это (внутри' key')Заметьте, что вы потеряете свое строковое значение, вы переписываете его с помощью фактического объекта (вы можете использовать другое имя переменной, чтобы сохранить оба). Однако, если у вас нет места, чтобы получить ваш экземпляр по имени, вы не сможете делать то, что хотите, вам просто нужно передать фактический экземпляр в «key». – Esteban

+0

Я рекомендую книгу [Eloquent Javascript] (http://eloquentjavascript.net/contents.html), чтобы получить синтаксис и семантику JavaScript. Есть также отличные (в основном более продвинутые) статьи в (Superhero.js) [http://superherojs.com/]. – Esteban

2

В ES5, можно только создать или принести «динамические свойства» на объекте. Таким образом, вам нужен объект или использовать его. с обозначением [].

var prop = "something"; 

this[prop] ="my value"; 

//this.something=== "my value" 

var obj = {}; 

obj[prop] = "a value"; 

// obj.something === "a value"; 

var obj1 = {prop:"value"} 
// will not make obj.something === "value" 
// but obj.prop==="value" because in this case prop cannot be a variable 

так что вам нужно сделать что-то вроде этого:

var arg1 = {}; 
arg1[prop]=value2; 
var arg2 = {} 
arg2[prop] = value2; 
createjs.Tween.get(instance, arg1).to(arg2, -(value2 + -door[prop]) * 10, createjs.Ease.ease); 

и так далее, вам нужно определить объекты, прежде чем передать их createjs.Tween.get методу.

instance, вероятно, должен быть объектом, а не строкой, но поскольку я не знаю ни createJS, ни вашего сценария, я не могу сказать.

EDIT: прочитать: http://www.jibbering.com/faq/faq_notes/square_brackets.html