Вопрос о построении модели Javascript - PullRequest
0 голосов
/ 26 апреля 2011

Я работаю над реализацией модели Javascript в веб-приложении, над которым я работаю.Цель модели - просто хранить информацию о состоянии страницы.Я сталкивался с двумя различными реализациями для создания модели, и мне было интересно, какая из них лучше всего использовать.Первая реализация:

var PageInfo = function () {
    this._info = {}; 
};

PageInfo.prototype = {
    getInfo: function () {
        return this._info;
    },
    setInfo: function (updatedInfo) {
        this._info = updatedInfo;
    }
};

Вторая реализация:

var pageInfo = function () {
    var info = {};

    return {
        getInfo: function () {
            return info;
        },
        setInfo: function (updatedInfo) {
            info = updatedInfo;
        }
    }
};

Другой вопрос, который у меня возник, касается функции setInfo ().Когда я обнаруживаю, что обновляю модель, я часто хочу, чтобы информация, которую я только что изменил, была немедленно доступна мне.Это привело меня к написанию функции-установщика следующим образом:

setInfo: function(updatedInfo) {
    info = updatedInfo;
    return info;
}

, которую я реализую в коде так:

var info = pageInfo.setInfo(newInfo);

Это нормально, или я должен реализовывать это следующим образом?:

pageInfo.setInfo(newInfo);
var info = pageInfo.getInfo();

Просто стараюсь следовать рекомендациям и избегать проблем, которые могут возникнуть при использовании неправильной реализации.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Обе реализации вполне приемлемы.Первый будет быстрее, хотя и незначительным, но выставит свои внутренние ресурсы миру.Это означает, что любая переменная, которая содержит ссылку на экземпляр PageInfo, сможет манипулировать свойством _info.Как правило, это не проблема, поскольку свойства с подчеркиванием (_) считаются частными и должны быть оставлены в покое.

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

Что касается вашего второго вопроса, опять-таки любой из них приемлем.Мне нравится, чтобы интерфейс для методов доступа был согласованным, поэтому я бы сказал, что setInfo не должен ничего возвращать, но есть исключения из каждого правила.Исключение из правила возникает, когда значение, возвращаемое getInfo, не будет соответствовать тому, что было передано setInfo.То есть, если getInfo возвращает значение, отличное от значения, переданного setInfo, вы можете захотеть вернуть значение из setValue.В противном случае вызывающая сторона может просто повторно использовать значение, переданное setValue вместо вызова getValue.

0 голосов
/ 26 апреля 2011

1-я реализация лучше, так как во 2-й реализации каждый раз, когда вы вызываете функцию pageInfo, вы определяете 2 новые функции (или устанавливаете закрытие), в то время как 1-я реализация определяет их в прототипе и повторно использует.

Для другого вопроса, если вы делаете это только для сохранения строк, я мог бы предложить что-то вроде:

var info = pageInfo.setInfo (newInfo) || pageInfo.getInfo ();

при условии, что setInfo возвращает неопределенное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...