Объектный литерал Javascript: почему я не могу этого сделать? - PullRequest
3 голосов
/ 13 июля 2010

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

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;
            }
        };

    } ()
}

Я добавляю элементы в объект icons следующим образом:

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, не определена , похоже, исходит из библиотеки.Я бы хотел сохранить стиль ассоциативного массива.

Есть идеи?

Обновление

Похоже, этот конфликт исходит от карт 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'о

Ответы [ 3 ]

4 голосов
/ 13 июля 2010

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

РЕДАКТИРОВАТЬ: Хотя технически это должно работать в любом случае, так как массив является объектом. Вы уверены, что здесь больше ничего нет?

РЕДАКТИРОВАТЬ # 2 : Разве вы не можете просто сделать allIcons как свойство MapListings?

РЕДАКТИРОВАТЬ # 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'] )
    }
}
1 голос
/ 13 июля 2010

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

MapListings.icons["c7"]

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

add: function (iconType, iconImage) { 
    MapListings.icons[iconType] = iconImage;
}, 
0 голосов
/ 13 июля 2010

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

...