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/