JavaScript 原型hook实现

JavaScript中基于原型的继承机制是动态的

对象从其原型继承属性,如果创建对象之后原型的属性发生改变,也会影响到继承这个原型的所有实例对象。也就是说如果通过某种方法,修改了类的原型中的属性,那么所有通过该原型创建的实例对象的相应属性也会被改变。

nodejs的hook实现利用以上语言特性,将对象中需要hook的属性所对应的原型进行修改,实现hook之目的。

以下给出一个例子:

    var Obj = function(a, b){
       this.x = a;
       this.y = b;
    }
    Obj.prototype.add = function(z){
        return this.x + this.y + z;
    }

    var o = new Obj(1,2);
    console.log(o.add(3)); //控制台将输出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;
    }
}

输出打印:

var o = new Obj(1,2);
wrap(Obj.prototype, 'add');
console.log(o.add(3)); //控制台将输出true

完整代码:

   var Obj = function(a, b) {
       this.x = a;
       this.y = b;
   }
   Obj.prototype.add = function(z) {
       return this.x + this.y + z;
   }
   var o = new Obj(1, 2);
   console.log(o.add(3)); //控制台将输出6。
   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;
       }
   }
   var o = new Obj(1, 2);
   wrap(Obj.prototype, 'add');
   console.log(o.add(3)); //控制台将输出6。

控制台将输出:
6
function start execute.
function finish execute.
6

可以用在线编辑器运行试试
https://tool.lu/coderunner/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值