我正在尝试使用Javascript Proxy
objects来捕获传递给我所代理的目标的“方法”的参数。
请考虑这个例子:
var test = {
doSomething: function() {
console.log( arguments.length );
}
};
var testProxy = new Proxy( test, {
get: function( target, property, receiver ) {
// I'd like to have access to any arguments when
// the property being accessed here is a function
// that is being called
return target[ property ];
}
} );
testProxy.doSomething( 'this', 'is', 'lame' ); // I want to trap those arguments
当属性实际上是一个函数时,这些Proxy
对象似乎只允许你捕获属性,而不是实际的函数调用及其参数。
在对此事进行反思之后,我“得到”(原谅双关语)get
方法仅用于属性访问,而不是调用,但后来我希望能够在call
中定义类似于Proxy
方法的内容。
也许在apply
中定义Proxy
方法是可行的,但是我可能必须为我想要代理的对象的每个单独方法创建一个Proxy
对象;那不是我追求的目标。
除非我在这里忽略了一个实际的替代可能性:在Proxy
实施中如何忽略这一点?!代理的全部意义不是能够拦截方法调用及其参数吗?
或者这是对Javascript的另一个误解,就我而言,Javascript不是一种“经典”OOP语言,我正在寻找的功能在Javascript环境中实际上没有意义吗?
答案 0 :(得分:9)
当然,实际上 是一种方法!我只是没有仔细考虑过它。我可以回复一个'代理'函数并捕获那里的参数:
var test = {
doSomething: function() {
console.log( arguments.length );
}
};
var testProxy = new Proxy( test, {
get: function( target, property, receiver ) {
switch( property ) {
case 'doSomething':
// you just have to return a proxy function
return function() {
// arguments accessible, after all!
console.log( 'testProxy::doSomething() arguments.length: ' + arguments.length );
// here you can still invoke the original method, of course
target[ property ].apply( this, arguments );
}
break
}
return target[ property ];
}
} );
testProxy.doSomething( 'this', 'is', 'not', 'so', 'lame', 'after', 'all' );
答案 1 :(得分:0)
另一个片段:)
const obj_hidden = {};
const obj = new Proxy(obj_hidden, {
get(target, prop) {
if (typeof target[prop] == 'function') {
return function (...args) {
console.dir({ call: [prop, ...args] });
return target[prop].apply(target, args);
}
}
console.dir({ get: prop });
return target[prop];
},
set(target, prop, value) {
console.dir({ set: [prop, value] });
target[prop] = value;
return true;
}
});