if (!Object.prototype.watchChange) { var isFunction = function (fn) { return fn && {}.toString.call(fn) === '[object Function]'; }; Object.defineProperty( Object.prototype, 'watchChange', { enumerable: false, configurable: true, writable: false, value: function (prop, handler) { var obj = this; function x(prop, handler) { var oldval = obj[prop], newval = oldval, getter = function () { return newval; }, setter = function (val) { return newval = handler.call(obj, prop, oldval, val); }; if (delete obj[prop]) { Object.defineProperty( obj, prop, { get: getter, set: setter, enumerable: true, configurable: true } ); } } if (isFunction(prop)) { for (var k in this) { new x(k, prop); } } else { new x(prop, handler) } } }); } if (!Object.prototype.unwatchChange) { Object.defineProperty( Object.prototype, 'unwatchChange', { enumerable: false, configurable: true, writable: false, value: function (prop) { var val = this[prop]; delete this[prop]; this[prop] = val; } } ); }