介绍
这是一个非常简单的脚本,让您创建一个代理类在JavaScript中。比方说,我们有一类将被用来作为构造函数(功能), 其上定义了一些功能,例如加,减,乘,除数学
。
function Math() {
this.IsMath = true;
}
Math.prototype = {
add: function(a, b) {
return a + b;
},
subtract: function(a, b) {
return this.add(a, -b);
},
multiply: function(a, b) {
return a * b;
},
divide: function(a, b) {
return a / b;
}
}
我们希望能够在某种程度上修改它的行为,将使我们能够拦截每个函数调用这个类beforeFunction的
事件和afterFunction
事件与内。
我们可以决定做任何我们想要的这两个功能。您可以访问我的另一篇文章<to updated>这使得使用此通用代理脚本,让你嘲笑摩卡错误(Node.js的)非常容易。在这篇文章中,我将定义一个简单的代理登录功能调用(这样做是在node.js的使用console.log的,但它可以很容易在浏览器代码修改)。
使用代码
一个函数名为createProxyDefinition
是你所需要的。此功能定义在proxy.js从本文所附的文件,你可以下载。该函数将3参数,beforeFunction
,afterFunction
更多
。
该beforeFunction
afterFunction
相当的解释。每当一个函数被调用目标类,这两个事件会火。
将给予beforeFunction
两个参数,第一个是被调用的函数名
,第二个参数
传递给函数的是一个数组。如果你返回一个值,从您的事件,原有的功能将不会被调用和返回值将被用来代替。
将给予afterFunction
三个参数,第一个是被调用的函数名
,第二个是从原来的函数的返回值,第三个是传递给函数的参数
数组。
任何额外的对象更多的
是,它会扩展类的原型传入
最好一个例子来解释如何使用类。我想创建一个简单的代理定义,仅仅打印出它们的参数一起被称为函数名,它可以用于跟踪函数调用。另一种更有用的例子,这是我想写这篇文章摆在首位的原因是让我做完整的代码覆盖node.js的项目写入时,请参考的文章<to updated>。
要创建一个代理定义日志文件(node.js的模块)
var beforeFunction = function(name, args) {
if(!this.__levels) {
this.__levels = 0;
}
for(var i = 0; i < this.__levels; i++) {
process.stdout.write(“\t”);
}
console.log(” Entering: >> “, name, ” : “, args);
this.__levels++;
};
var afterFunction = function(name, ret, args) {
this.__levels–;
for(var i = 0; i < this.__levels; i++) {
process.stdout.write(“\t”);
}
console.log(” Exiting: >> “, name)
}
var createCallsLogger = createProxyDefinition(beforeFunction, afterFunction);
createCallsLogger
现在是一个函数,它接受任何构造和修改它需要。
因为这将是一个示例使用:
createCallsLogger(Math);
var math = new Math();
math.add(1, 2);
math.subtract(10, 3);
math.multiply(5, 5);
math.divide(16, 4);
现在任何函数调用数学将被记录到控制台,输出示例如下:
usr/bin/node index.js
Entering: >> add : { ’0′: 1, ’1′: 2 }
Exiting: >> add
Entering: >> subtract : { ’0′: 10, ’1′: 3 }
Entering: >> add : { ’0′: 10, ’1′: -3 }
Exiting: >> add
Exiting: >> subtract
Entering: >> multiply : { ’0′: 5, ’1′: 5 }
Exiting: >> multiply
Entering: >> divide : { ’0′: 16, ’1′: 4 }
Exiting: >> divide
Process finished with exit code 0
引擎下
功能createProxyDefinition
需要定义一个类(构造函数),在所有它的原型功能,取代了每个功能的一个新功能,它需要调用和事件的代表团。此功能所附文件proxy.js的。粗略地说,这是它在伪代码。
function __createProxy(constructor, proxyInstanceDefinition)
{
if (proxy already added)
return;
for each function in constructor.prototype
{
var newName = __ + functionname;
copy original function reference to a new function with name “NewName”
create a new function to replace the current. the new function will call original function)
}
}
最后
这种代理的创建方法不拟用于生产代码,理想情况下,它被用于迅速嘲讽或进军其他类的,像的情况下,用它来 嘲笑node.js的错误,实现全覆盖。你是不建议使用它在生产代码的原因,是因为它基本上为每个函数创建新的函数实例被覆盖,所以理想而言,在生产环境中做这样的事情,你应该有自定义编写的代码,完全实现你想要什么没有额外的开销重定向和内存使用情况。