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 | |
}); | |
} | |
} | |
}; | |
} | |
i'm not sure how the test script works.. how are we supposed to test this?
I've rewrote this, optimized for minification + included some tests :
https://gist.github.com/adriengibrat/b0ee333dc1b058a22b66
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is a great improvement over the initial version, thank you very much.
Would you mind licensing it under MIT and add an appropriate license header? http://en.wikipedia.org/wiki/MIT_License#License_terms