2010-07-13 4 views
3

У меня есть следующий (упрощенный) литерал объекта. Метод значков использует закрытие, чтобы скрыть переменную значков, которую я хотел бы иметь в качестве ассоциативного массива для последующих поисков.Javascript object literal: почему я не могу это сделать?

var MapListings = { 
    icons: function() { 
     var allIcons = [] ; 

     return { 
      add: function (iconType, iconImage) { 
       var icon = new GIcon(MapListings.baseIcon); 
       icon.image = iconImage; 
       allIcons[iconType] = icon; // fails, but this is what I want 
       // allIcons.push(icon); // works, but this is not what I want 
      }, 
      get: function() { 
       return allIcons; 
      } 
     }; 

    }() 
} 

добавить детали к иконам объекта следующим образом:

MapListings.icons.add("c7", "/images/maps/blue.png"); 
MapListings.icons.add("c8", "/images/maps/red.png"); 

Следующая не работает:

allIcons[iconType] = icon; 

Но это делает:

allIcons.push(icon); 

За пределами закрытия работает стиль ассоциативного массива отлично, возможно, есть конфликт с jQuery? Ошибка, которую я получаю в firebug a не определена выглядит из библиотеки. Я бы хотел поддерживать стиль ассоциативного массива.

Любые идеи?

Update

Похоже, что этот конфликт происходит из карт Google. Странно, не уверен в этом.

Dumbass Update

Часть моего литерал объекта, возвращающего база GIcon() объект не возвращается объект вообще. Таким образом, объект не имел правильных свойств.

baseIcon: function() { 
    var base = new GIcon(); 
    base.shadow = '/images/maps/shadow.png'; 
    base.iconSize = new GSize(12, 20); 
    base.shadowSize = new GSize(22, 20); 
    base.iconAnchor = new GPoint(6, 20); 
    base.infoWindowAnchor = new GPoint(5, 1); 
    return base; 
} 

И MapListings.baseIcon не совпадает с MapListings.baseIcon()! D'о

+0

Я только что вставил это в HTML-файл и заменить GIcon с помощью заполнителя. похоже, хорошо работает. Возможно, ошибка находится в объекте GIcon, а не в коде. Я запускаю Firefox 3.5 в Linux. – Gennadiy

+1

Вы уверены, что ошибка «a isdefined» связана с этим кодом? – Jacob

+0

@gennaidiy - GIcon с карт Google. Это не тот объект GIcon, который создает конфликт, но он выглядит как библиотека карт google. – ScottE

ответ

4

если вы хотите таблицу поиска, просто сделать var allIcons = {}

EDIT: Хотя технически она должна работать в любом случае, так как массив является объектом. Вы уверены, что этого больше нет?

EDIT # 2: Не можете ли вы просто сделать allIcons как свойство MapListings?

EDIT # 3: Я думаю, что он работает, но, возможно, вы не обращаетесь к нему правильно? Это или он не создает объект с Google каким-то образом, или ошибка вы вывесили происходит в другом месте, а не здесь

function GIcon(){}; 
var MapListings = { 
    icons: function() { 
     var allIcons = [] ; 

     return { 
      add: function (iconType, iconImage) { 
       var icon = new GIcon(MapListings.baseIcon); 
       icon.image = iconImage; 
       allIcons[iconType] = icon; // fails, but this is what I want 
       // allIcons.push(icon); // works, but this is not what I want 
       window.x = allIcons 
      }, 
      get: function() { 
       return allIcons; 
      } 
     }; 

    }() 
}; 

MapListings.icons.add("c7", "/images/maps/blue.png"); 
MapListings.icons.add("c8", "/images/maps/red.png"); 

alert(MapListings.icons.get()['c8']['image']) 

Вы не должны петли с помощью .Length, но вместо того, чтобы получить быстрый доступ к c7 или c8.

x = MapListings.icons.get(); 
for (var prop in x) { 
    if (x.hasOwnProperty(prop)) { 
     alert(x[prop]['image']) 
    } 
} 
+0

попробовал это уже, та же ошибка: a не определено – ScottE

+1

+1 за то, что ошибка в другом месте. – Anurag

+0

это побеждает цель закрытия. Я бы предпочел оставить это как частный член, так как метод .add выполняет другую работу. Я только хочу, чтобы значки были добавлены таким образом. – ScottE

0

allIcons[iconType] = icon; терпит неудачу, потому что allIcons является массив, не является объектом. Попробуйте инициализировать allIcons вместо {}. Это позволит вам размещать элементы в коллекции по ключу.

+0

Неправда, это прекрасно работает за пределами моего примера. Они не рекомендуются использовать таким образом, но смотрите здесь: http://www.hunlock.com/blogs/Mastering_Javascript_Arrays – ScottE

+0

Ничего, что я могу найти в этом документе, говорит, что для массивов разрешены строки. – Jacob

+1

Любой объект в JS может иметь свойства, поэтому массив тоже может быть. – casablanca

1

Итак, одно можно сделать, чтобы исправить это - изменить способ обращения к массиву.Так как внешний по отношению к методу надстройки вы это делаете:

MapListings.icons["c7"] 

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

add: function (iconType, iconImage) { 
    MapListings.icons[iconType] = iconImage; 
},