-
Notifications
You must be signed in to change notification settings - Fork 0
/
enum.js
71 lines (61 loc) · 1.86 KB
/
enum.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function EnumItem (name, id, parent) {
this.name = name;
this.id = id;
Object.defineProperty(this, 'parent', { value: parent });
}
EnumItem.prototype.toString = function () {
return this.name;
};
EnumItem.prototype.valueOf = function () {
return this.id;
};
EnumItem.prototype.hasFlag = function (item) {
if (item instanceof EnumItem) {
if (item.parent === this.parent) {
return (this.id & item.id) === item.id;
}
}
return false;
};
EnumItem.prototype.isA = function (item) {
if (item instanceof EnumItem) {
if (item.parent === this.parent) {
return (this.id & item.id) === this.id;
}
}
return false;
};
EnumItem.prototype.isEqual = function (item) {
return (item instanceof EnumItem) && (this.id === item.id);
};
function Enum (list, abstracts) {
var i = 0,
name = '',
abstractNames = [],
id = 1;
this.None = new EnumItem('None', 0, this);
for (i = 0; i < list.length; ++ i) {
name = list[i];
this[name] = new EnumItem(name, id, this);
id = id << 1;
}
if (typeof abstracts === 'object' && abstracts !== null) {
abstractNames = Object.keys(abstracts);
for (i = 0; i < abstractNames.length; ++ i) {
name = abstractNames[i];
this[name] = this[name] || new EnumItem(name, abstracts[name].map(function (name) {return this[name].id;}.bind(this)).reduce(function (a, b) {return a + b;}), this);
}
}
}
module.exports = Enum;
if (!module.parent) {
var Device = new Enum(['SmartPhone', 'FeaturePhone', 'Tablet', 'PC'], {'Mobile': ['SmartPhone', 'FeaturePhone']});
console.log(Device.SmartPhone);
console.log(Device.FeaturePhone);
console.log(Device.Tablet);
console.log(Device.PC);
console.log(Device.Mobile);
console.log(Device.Mobile.hasFlag(Device.SmartPhone));
console.log(Device.Mobile.hasFlag(Device.Tablet));
console.log(Device.Mobile.isEqual(Device.Mobile));
}