我有3个布尔一个JavaScript对象:JavaScript对象中的互斥布尔值?
var obj = {};
obj.isPrimary = true;
obj.isPromotion = false;
obj.isSocial = false;
只有这些人可以是真实的,永远不会有多于1是真实的情况。我怎样才能做到这一点?
我有3个布尔一个JavaScript对象:JavaScript对象中的互斥布尔值?
var obj = {};
obj.isPrimary = true;
obj.isPromotion = false;
obj.isSocial = false;
只有这些人可以是真实的,永远不会有多于1是真实的情况。我怎样才能做到这一点?
您可以使用Object.defineProperty
类似:
Object.defineProperty(obj, 'isPrimary', {
get: function(){
return !this.isPromotion && !this.isSocial; //<-- Your logic goes here.
}
});
当然后面打开和关闭它是由你切换此选项的逻辑。
使用的getter/setter应该做的伎俩:
var obj = {
set isPrimary(bool){
this.Primary = bool;
if(bool){
this.Promotion = this.Social = false;
}
},
set isSocial(bool){
this.Social = bool;
if(bool){
this.Promotion = this.Primary = false;
}
},
set isPromotion(bool){
this.Promotion = bool;
if(bool){
this.Primary = this.Social = false;
}
},
get isPrimary(){ return this.Primary; },
get isSocial(){ return this.Social; },
get isPromotion(){ return this.Promotion; }
}
obj.isPrimary = true;
obj.isSocial = true;
obj.isPromotion = true;
alert(obj.isPrimary + ' ' + obj.isSocial + ' ' + obj.isPromotion);
// false false true (So only `obj.isPromotion` is true)
闭包是你的朋友。他们阻止有人可以摆弄内部状态。
function createPropObj() {
var props = 0;
return {
get isPrimary() { return props === 1; },
set isPrimary(val) { if (val) { props = 1; }; },
get isPromotion() { return props === 2; },
set isPromotion(val) { if (val) { props = 2; }; },
get isSocial() { return props === 4; },
set isSocial(val) { if (val) { props = 4; }; }
}
}
您可以使用它像:
> var test = createPropObj();
undefined
> test.isPrimary = true;
true
> test.isPromotion = true;
true
> test.isPrimary
false
你可以用这样的
function createToggleValues() {
var options = {
"primary": 1,
"promotion": 2,
"social": 4
},
value = 0;
return {
"set": function(name) {
value = options[name];
},
"is": function(name) {
return (value & options[name]) === options[name];
}
}
};
var togglable = createToggleValues();
togglable.set("primary");
console.log(togglable.is("primary"));
// true
的功能。如果您需要更多的选择要添加模拟这一点,那么你可能想只需用新值和下一个2的倍数来扩展options
对象。
您可以创建一个负责允许一次标记为真的对象。这将减轻您的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; }
};
使用适当切换属性的getter和setter。您仍然可以直接更新值。 – Mathletics 2014-09-30 14:32:40
我说更简单的方法是实现一个类,并为这两个变量设置getter&setter。改变一个会自动改变另一个。 – tfrascaroli 2014-09-30 14:33:17
也可以在一个函数中做到这一点?例如,设置其中一个只会将其他设置改为false。 – xaisoft 2014-09-30 14:36:32