JavaScript получить элемент в объектный код


Поэтому у меня есть некоторые JavaScript код, похожий на следующий:

var mylibrary = new (function ()
{

    this._getLibraryObj = function ()
    {
        var newLibraryObj = {};
        var libraryData = window.specifiedLibraryData;
        // Add head librarian details
        // open library
        // etc. etc. turn into an object from data

        return newLibraryObj ;
    };

    this.item = function (item)
    {

        if (this.obj && item in this.obj)
        {
            return this.obj[item];
        }
        else
        {
            this.obj = this._getLibraryObj();
            if (item in this.obj)
            {
                return this.obj[item];
            }
            return null;
        }
    };

    return this;
})();

Что меня раздражает, так это, что это.элемент(item) функция повторяет пункт в этом.параметр obj[предмета] , и я нахожу это немного трудно читать. Я надеялся, что за это не придется бегать _getLibraryObj слишком часто.

Вопрос: как бы вы переписать это.пункт() , чтобы быть коротким и сладким (сухой и читаемый)?

Редактировать:- от Алекса поста я понял, я оставил одно ограничение: если товар не в библиотеке объекта, то он может понадобиться _getLibraryObj() снова как данные могут измениться

Решение:- я в конечном итоге с помощью @Алекс Нолан'ы пятый пример || Вместо && мне легче читать.):

this.item = function(item)
{
    if(!this.obj || !item in this.obj)
    {
        this.obj = this._getLibraryObj();
    }

    return this.obj[item] || null;
}


1611
1
задан 6 сентября 2011 в 12:09 Источник Поделиться
Комментарии
1 ответ

Другой угрозой этого.пункт() функция заключается в том, что если позиции не в этом.параметр obj, это._getLibraryObj() будет вызываться каждый раз.

Попробовать

this.item = function(item) {
if (this.obj) {
return this.obj[item] || null;
} else {
this.obj = this._getLibraryObj();
return this.item(item);
}
};

Или если вы хотите его еще больше минимальной:

this.item = function(item) {
if (this.obj)
return this.obj[item] || null;

this.obj = this._getLibraryObj();
return this.item(item);
};

Если вы переключить на заявления немного вы получаете самый читаемый ИМХО:

this.item = function(item) {
if (!this.obj)
this.obj = this._getLibraryObj();

return this.obj[item] || null;
};

Один окончательный способ сделать это было бы сделать:

this.item = function(item) {
this.obj = this.obj || this._getLibraryObj();

return this.obj[item] || null;
};

Редактировать:

В свете вашего замечания о необходимости повторного вызова getLibraryObj

this.item = function(item) {
if (!(this.obj && item in this.obj))
this.obj = this._getLibraryObj();

return this.obj[item] || null;
};

или:

this.item = function(item) {
this.obj = this.obj && item in this.obj ? this.obj : this._getLibraryObj();

return this.obj[item] || null;
};

или один-лайнер:

this.item = function(item) {
return (this.obj = (this.obj && item in this.obj ? this.obj : this._getLibraryObj()))[item] || null;
};

1
ответ дан 6 сентября 2011 в 03:09 Источник Поделиться