r3b
5/25/2017 - 7:21 PM

ES5 ENUM implementation

ES5 ENUM implementation

function ENUM(){
  return Object.create({}, {
    add: {
      value: function (name) {
        name = name.replace(/\s/, '_').replace(/\W/, '').toUpperCase();
        var ptr = this;
        Object.defineProperty(ptr, name, {
          enumerable: true,
          configurable: false,
          writable: false,
          value: 1 << Object.keys(ptr).length
        });
      },
      writable: false,
      enumerable: false,
      configurable: false
    },
    valueOf: {
      value: function (val) {
        return (function (ptr) {
          return Object.keys(ptr).filter(function (key) {
            return ptr[key] === val;
          }).pop();
        })(this);
      },
      writable: false,
      enumerable: false,
      configurable: false
    },
    get: {
      value: function (key) {
        return (function (ptr) {
          return ptr[key];
        })(this);
      },
      writable: false,
      enumerable: false,
      configurable: false
    }
  });
}