Kleines Beispiel zum Abfangen von Object Property-Zugriffen mit Object.defineProperty

Thomas Darimont

Erfahrenes Mitglied
Hallo,

bei diesem Beispiel mache ich mir die erweiterten Konfigurationsmöglichkeiten von Object.defineProperty zu nutze um lesende und schreibende Property Zugriffe an JavaScript Objekten überwachen zu können.

Läuft in Chrome und Firefox.

Damit lassen sich Property-Zugriffe wie:

Javascript:
var x = someObject.someProperty;
var y = someObject["someProperty"] ;
someObject.someProperty = newValue ;
abfangen.

Hier gibt es eine Erklärung zu Object.defineProperty
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

JS_PropertyAccessInterception_Example.html:
Javascript:
<html>
	<head>
		<script type="text/javascript">
			var obj1 = {
				  foo : "FOOO"
				, bar : 4711
			};
			
			var obj2 = {
				  foo : "MOOO"
				, bar : 1234
			};
			
			
			var wrapper = {
				wrap:function(target, beforeSet, beforeGet){
					for(var key in target){
						if(key){
							var value = target[key];
							
							/* save original values to a "private" store */
							if(!target.$$private){
								target.$$private = {};
							}
							target.$$private[key] = value;
						
							(function(target,key, value){
								var propConfig = {
									configurable:true,
									set: function(newValue){
										if(beforeSet){
											beforeSet(target,key,value,newValue);
										}
										target.$$private[key] = newValue;
									},
									get : function(){
										if(beforeGet){
											beforeGet(target,key);
										}
										return target.$$private[key];
									}
								};
								
								Object.defineProperty(target, key, propConfig);
							})(target, key, value);
						}	
					}
				}
			};
						
			
			function beforeSet(target,key,value,newValue){
				alert("Before set: " + key + " on " + target + " from value: " + value +" to new value: " + newValue);
			};
			
			function beforeGet(target,key){
				alert("Before get: " + key + " on " + target);
			};
			
			wrapper.wrap(obj1, beforeSet, beforeGet);
			
			//getters
			
			/*
			alert("obj1.foo:"  + obj1.foo);
			
			alert("obj2.foo: "  + obj2.foo);
			*/
			
			//getters & setters
			
			obj1.foo = "XOOOOO";
			alert("obj1.foo:"  + obj1.foo);
			
			alert("obj1.foo:"  + obj1["bar"]);
			
		</script>
	</head>
	
	<body>
	</body>
</html>

Gruß Tom
 

Neue Beiträge

Zurück