2015-06-09 2 views
2

У меня есть массив объектов, в котором мне нужно назначить уникальный идентификатор. Для того, чтобы сделать его простым, я объявил глобальный вар для этого идентификатора, что я обновляю на каждом новом объекте:Назначить значение глобальной переменной объекту

var id_unit = 0, 
    units = [], 
    merc = [ 
     {name: 'grunt',  id: 0, level: 1, hp: 1, atk: 1, def: 1, deployed: false}, 
     {name: 'big grunt', id: 0, level: 1, hp: 1, atk: 1, def: 1, deployed: false} 
    ]; 

function buy_unit(type, callback) { 
    var unit = merc[type]; 
    unit.id = id_unit;//0 + id_unit //new Number(id_unit) //Number(id_unit) 
    id_unit = id_unit + 1; 
    units.push(unit); 
    callback('OK'); 
} 

проблема, когда я использую эту функцию, идентификатор, похоже, получил адрес в unit_id вместо его значение:

buy_unit 
unit_id: 0 
i: 0 id: 0 level: 1  deployed: false 

buy_unit 
unit_id: 1 
i: 0 id: 1 level: 1  deployed: false 
i: 1 id: 1 level: 1  deployed: false 

Когда то, что я ожидал был:

buy_unit 
unit_id: 1 
i: 0 id: 0 level: 1  deployed: false 
i: 1 id: 1 level: 1  deployed: false 

Почему unit_id возвращение его указатель, а не его значение? Как я могу получить стоимость?

+0

реальный код внутри цикла, так что 'id_unit' настоящее время захвачены в затворе? См. Http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – RichieHindle

ответ

4

Это не создает копию объекта:

var unit = merc[type]; 

Он просто делает unit ссылаться на тот же объект, как merc[type], так что если вы назначаете unit.id вы меняете id свойства блока в ваш массив merc.

Похоже, вы хотите использовать merc[type] в качестве прототипа для нового объекта:

var unit = Object.create(merc[type]); 
+0

Большое спасибо, это было именно то, что мне нужно :) – DrakaSAN

+0

@DrakaSAN Добро пожаловать – Paulpro

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