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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| <script>
//https://gist.github.com/adriengibrat/b0ee333dc1b058a22b66
/**
* Object.prototype.watch polyfill
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch
*
* Known limitations:
* - `delete object[property]` will remove the watchpoint
*
* Based on Eli Grey gist https://gist.github.com/eligrey/384583
* Impovements based on Xose Lluis gist https://gist.github.com/XoseLluis/4750176
* This version is optimized for minification
*
* WTFPL.
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
*/
(function (Object, descriptor) {
var prototype = Object.prototype,
defineProperty = Object.defineProperty,
getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,
enumerable = 'enumerable';
// object.watch
if (!prototype.watch) {
descriptor.value = function (property, handler) {
var
descriptor = getOwnPropertyDescriptor(this, property),
_value = descriptor.value,
getter = descriptor.get || function () {
return _value;
},
setter = function (value) {
_value = handler.call(this, property, _value, value);
if (setter._set) {
setter._set.call(this, _value);
}
return _value;
}
;
setter._set = descriptor.set; // backup old setter
if (descriptor.configurable && // can't watch constants
descriptor.writable !== false) { // don't watch readonly
defineProperty(this, property, {
get: getter,
set: setter,
enumerable: descriptor[enumerable],
configurable: true
});
}
};
defineProperty(prototype, 'watch', descriptor);
// object.unwatch
descriptor.value = function (property) {
var descriptor = getOwnPropertyDescriptor(this, property);
if (descriptor.set && descriptor.set.hasOwnProperty('_set')) {
defineProperty(this, property, descriptor.set._set ? {
get: descriptor.get,
set: descriptor.set._set,
enumerable: descriptor[enumerable],
configurable: true
} : {
value: this[property],
enumerable: descriptor[enumerable],
configurable: true,
writable: true
});
}
};
defineProperty(prototype, 'unwatch', descriptor);
}
})(Object, {enumerable: false, configurable: true, writable: false});
//https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/watch
function watchVar(id, oldval, newval) {
console.log("o." + id + " a été modifiée de " + oldval + " en " + newval);
return newval;
}
var o={a:0,b:null};
o.watch("a",watchVar);
o.watch("b",watchVar);
o.b=o.a++;
//o.a a été modifiée de 0 en 1
//o.b a été modifiée de null en 0
</script> |
Partager