Last active
May 15, 2016 02:41
-
-
Save XoseLluis/4750176 to your computer and use it in GitHub Desktop.
Polyfill for the Object.watch/Object.unwatch functions available in Mozilla browsers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Polyfill for the Object.watch/Object.unwatch functions available in Mozilla browsers | |
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/watch | |
you have a test here: | |
http://www.telecable.es/personales/covam1/deployToNenyures/SourceCode/Object.watch.test.js | |
and can read more here: | |
http://deploytonenyures.blogspot.com.es/2013/02/objectwatch-polyfill.html | |
*/ | |
if (!Object.prototype.watch) { | |
Object.prototype.watch = function(prop, handler){ | |
var desc = Object.getOwnPropertyDescriptor(this, prop); | |
var newGet; | |
var newSet; | |
//these cases make little sense, so do nothing we won't be watching readonly descriptors | |
if (!desc.configurable | |
|| (desc.value === undefined && !desc.set) | |
|| desc.writable === false) | |
return; | |
if (desc.value){ | |
var val = desc.value; | |
newGet = function(){ | |
return val; | |
}; | |
newSet = function(newVal){ | |
val = handler.call(this, prop, val, newVal); | |
}; | |
//let's leverage the setter to store initial information to enable "unwatch" | |
newSet._watchHelper = { | |
initialType: "dataDescriptor" | |
}; | |
} | |
else{ | |
newGet = desc.get; | |
newSet = function(newVal){ | |
val = handler.call(this, prop, val, newVal); | |
desc.set.call(this, val); | |
}; | |
newSet._watchHelper = { | |
initialType: "accessorDescriptor", | |
oldDesc: desc | |
}; | |
} | |
Object.defineProperty(this, prop, { | |
get: newGet, | |
set: newSet, | |
configurable: true, | |
enumerable: desc.enumerable | |
}); | |
}; | |
Object.prototype.unwatch = function(prop){ | |
var desc = Object.getOwnPropertyDescriptor(this, prop); | |
if (desc.set._watchHelper){ | |
if(desc.set._watchHelper.initialType == "dataDescriptor"){ | |
Object.defineProperty(this, prop, { | |
value: this[prop], | |
enumerable: desc.enumerable, | |
configurable: true, | |
writable: true | |
}); | |
} | |
else{ | |
Object.defineProperty(this, prop, { | |
get: desc.get, | |
set: desc.set._watchHelper.oldDesc.set, | |
enumerable: desc.enumerable, | |
configurable: true | |
}); | |
} | |
} | |
}; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I've rewrote this, optimized for minification + included some tests :
https://gist.github.com/adriengibrat/b0ee333dc1b058a22b66