在JavaScript中的代理模式

介绍 

这是一个非常简单的脚本,让您创建一个代理类在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参数,beforeFunctionafterFunction 更多

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错误,实现全覆盖。你是不建议使用它在生产代码的原因,是因为它基本上为每个函数创建新的函数实例被覆盖,所以理想而言,在生产环境中做这样的事情,你应该有自定义编写的代码,完全实现你想要什么没有额外的开销重定向和内存使用情况。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值