2012-01-25 4 views
0

На данный момент я испытываю какое-то действительно странное поведение объекта. У меня есть этот шаблон объекта:Связанные объекты?

template: { 
     trigger: { 
      width: 32, 
      height: 32, 
      delay: 0 
     }, 

     player: { 
      direction: { 
       value: "right", 
       options: "left|right" 
      } 
     }, 

     apple: { 
      direction: { 
       value: "down", 
       options: "up|down|left|right" 
      } 
     } 
}, 

, который является объектом объекта под названием layers. Внутри функции объекта layers Я добавляю новые данные (объекты) в пустой объект entities.

if (!this.entities[which]) 
{ this.entities[which] = []; } 

if (!this.entities[which][id]) 
{ this.entities[which][id] = {}; } 

this.entities[which][id].pos = "0,0"; 
this.entities[which][id].variables = {}; 
this.entities[which][id].variables = this.template[which]; 

Так позже, когда я пытаюсь изменить this.entities[which][id].variables.width, например, каждый entitie которому принадлежит тот же шаблон для which получает то же свойство, а также объект шаблона, который не будет изменен в коде хоть. Я отлаживал почти все и просматривал каждый бит кода. Идентификаторы entitie также уникальны.

часть, где объект получает изменился, выглядит так: input.setAttribute("onkeyup", "layers.entities['" + i + "'][" + j + "].variables['" + jj + "'] = this.value; layers.updateEntities();");

Где я это имя entitie, J является идентификатором и Дж.Дж. имени опций.

Вы можете попробовать его для себя прямо здесь: [удалено]

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

Потому что сам шаблон get изменился, я подумал, что этот this.entities[which][id].variables = this.template[which]; каким-то образом связывает эти два объекта вместе, вместо того, чтобы присваивать «копию» левой переменной. Я никогда не слышал ничего подобного.

ответ

1

Объекты в Javascript передаются вокруг по ссылке, так что вы правы, подозревая, что проблема была все обмена и тот же набор переменных:

var a = {x:1}; 
var b = a; 
b.x = 2; 
console.log(a.x); //gives 2 

Есть много способов, чтобы исправить свой код, но очень простой один будет иметь шаблоны как функции «конструктор», а не возвращать объект напрямую

template: { 
    trigger: function(){ 
     //now we return a brand new object each time. 
     return { 
      width: 32, 
      height: 32, 
      delay: 0 
     }; 
    }, 
    player: function(){ /*...*/}, 
    apple: function(){ /*...*/} 
} 

//... 

this.entities[which][id].variables = this.template[which](); 
                 //^^^ 
+0

Ах, я не знал об этом. Спасибо! :) –

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