Вы может создать объект, ответственный за то, что один флаг может быть истинным одновременно. Это избавит ваш obj
от реализации этой логики. В приведенном ниже примере SingleTrueFlagGroup
хранится в коллекции флагов, позволяя одному одновременно быть истинным. Ваш obj
может затем дважды отправить на экземпляр этого объекта, чтобы выполнить задание.
Преимущество подобной реализации состоит в том, что добавление и удаление флагов становится тривиальным.
var flags = ['isPrimary', 'isPromotion', 'isSocial'],
obj = {
_flags: new SingleTrueFlagGroup(flags)
};
flags.forEach(function (flag) {
Object.defineProperty(obj, flag, {
get: function() { return this._flags.get(flag); },
set: function (value) { this._flags.set(flag, value); }
});
});
obj.isPrimary = true;
obj.isPromotion = true;
console.log(obj.isPrimary); //false
console.log(obj.isPromotion); //true
function SingleTrueFlagGroup(flags) {
this._flags = {};
(flags || []).forEach(this.add.bind(this));
}
SingleTrueFlagGroup.prototype = {
constructor: SingleTrueFlagGroup,
set: function (flagToSet, value) {
var flags = this._flags;
(flags[flagToSet] = !!value) && Object.keys(flags).forEach(function (flag) {
if (flag !== flagToSet) flags[flag] = false;
});
},
get: function (flag) { return this._flags[flag]; },
add: function (flag) { this._flags[flag] = false; }
};
Используйте геттеры и сеттеры, которые соответствующим образом переключают свойства. Тем не менее, вы все равно сможете обновлять значения. – Mathletics
Я говорю, что проще будет реализовать класс, а также getter & setter для обеих переменных. Изменение одного автоматически изменило бы другое. – tfrascaroli
Можно ли просто сделать это в функции? Например, установка одного только изменит остальные на false. – xaisoft