javascript extender (TypeExtend)  [ 743 views ]

I have read on many pages that this is evil like eval. Everything is evil if you can’t use that.

Unsafe extend. In this sample I aggree with the evli idea. This is simple and dangerous.

String.prototype.Contains = function(s) {
  return !!~this.indexOf(s);
};

Safe version. Better but not the best.
the skeleton

if (!TYPE.prototype.EXTENDER_FUNCTION) {
  Object.defineProperty(TYPE.prototype, 'EXTENDER_FUNCTION', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: THE_FUNCTION
  });
};

and the code

if (!String.prototype.Contains) {
  Object.defineProperty(String.prototype, 'Contains', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function (s) {
      return !!~this.indexOf(s);
    }
  });
};

instead of this almost nice solution do the following. Write an universal function which can create the extender with some additional safe methods like:

function TypeExtend(TYPE, EXTENDER_FUNCTION, FUNCTION,
                    _enumerable, _configurable, _writable){
  if (!TYPE['prototype'][EXTENDER_FUNCTION]) {
    Object.defineProperty(TYPE.prototype, EXTENDER_FUNCTION, {
      enumerable: _enumerable,
      configurable: _configurable,
      writable: _writable,
      value: FUNCTION
    });
    return true;
  };
  return false;
};

TypeExtend(String, 'Contains', function(s) { return !!~this.indexOf(s); });

for object extending

function ObjectExtend(OBJECT, EXTENDER_FUNCTION, FUNCTION){
  if (!OBJECT[EXTENDER_FUNCTION]) {
    OBJECT[EXTENDER_FUNCTION] = FUNCTION;
    return true;
  };
  return false;
};

ObjectExtend(Math, 'randomBetween', 
  function(min, max) { return Math.random() * (max - min) + min; }
);
#sidebar a { color:#fff; } #sidebar ul ul li { color: #DEF585; } #sidebar h2 { color: #fff; } #sidebar ul p, #sidebar ul select { color: #BEDDBE; } #backfly { background: url(images/golfBallWallPaper.jpg) left bottom fixed repeat-x #65a51d; }