素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

メソッドをフックする

はてブでreturnがなくなってるという指摘があったのでそれを修正した。

var Hook=function(){
	var old;
	this.addHook=function(obj,method,before,after){
		old=obj[method];
		obj[method]=function(){
			before&&before.apply(this,arguments);
			var ret=old.apply(this,arguments);
			after&&after.apply(this,arguments,ret);
			return ret;
		}
	}
	this.removeHook=function(obj,method){
		obj[method]=old;
	}
}

var h=new Hook();
h.addHook(window,'confirm',
		function(){
		console.log('beforeの引数',arguments);
		},
		function(){
		console.log('afterの引数',arguments);
		}
		);
var res=confirm('OK or NG');
console.log('メソッドの戻り値',res);
h.removeHook(window,'confirm');
confirm('notHook');

追記ここまで。

var Hook=function(){
	var old;
	this.addHook=function(obj,method,before,after){
		old=obj[method];
		obj[method]=function(){
			before&&before.apply(this,arguments);
			old.apply(this,arguments);
			after&&after.apply(this,arguments);
		}
	}
	this.removeHook=function(obj,method){
		obj[method]=old;
	}
}

var h=new Hook();
h.addHook(window,'alert',
		function(str){
		console.log('before',str);
		},
		function(str){
		console.log('after',str);
		}
	 );
alert('addHook');
h.removeHook(window,'alert');
alert('notHook');

なかなかおもしろい。
参考:Server error