nodejs的hook实现

本文介绍了如何使用Node.js中的原型继承特性来实现方法的Hook。通过修改原型对象的方法,可以在不改动原始对象的情况下,实现对特定方法的增强,如日志记录等功能。
    JavaScript中基于原型的继承机制是动态的:对象从其原型继承属性,如果创建对象之后原型的属性发生改变,也会影响到继承这个原型的所有实例对象。也就是说如果通过某种方法,修改了类的原型中的属性,那么所有通过该原型创建的实例对象的相应属性也会被改变。

    nodejs的hook实现利用以上语言特性,将对象中需要hook的属性所对应的原型进行修改,实现hook之目的。以下给出一个例子。
    function Range(from, to){
       this.from = from;
       this.to = to;
    }
    Range.prototype.include = function(x){return this.from <=x && x <= this.to;};

    var r = new Range(1,3);
    console.log(r.include(2)); //控制台将输出true。
以下是wrap函数的实现:
function wrap(obj, meth) {
//obj: 需hook的原型对象
//meth:需hook的原型属性名
   var orig = obj[meth];
   obj[meth] = function wrapper(){
       console.log(“function start execute.”);
       var res = orig.apply(this, arguments);
       console.log(“functionfinish execute.”);
       return res;
    }
}
wrap函数调用:
wrap(Range.prototype, 'include');
注:调用wrap可以在实例化Range之前或之后,只需要在实例对象调用被hook属性之前调用该wrap即可生效。

示例:
var r = new Range(1,3);
wrap(Range.prototype, 'include');
console.log(r.include(2)); 
控制台将输出:
function start execute.
function finish execute.
true
运行环境:nodejs:v6.11.2     os:win7 64位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值