ES6 代理 - 是否有可能在调用空对象之前捕获调用它们的方法?
ES6 Proxies - Is it possible to capture methods called upon a null object before they happen?
我正在使用 API,它 return 是一种在用户提交数据之前验证表单的架构。
例如,架构有一个 User
class,具有名为 email
的属性。如果有错误,User.validators.getEmailErrors()
return 是所有错误的 Array
,例如['Email address cannot be blank', 'Email addresses must match']
.
但是,如果字段有效,并且没有发现错误,getEmailErrors()
returns null
.
在我的应用中,我想安全地链接 getEmailErrors()
中的更多方法,例如getEmailErrors().join(',')
,但没有事先检查 null
。相反,有没有办法,例如使用 ES6 代理,让 getEmailAddress()
知道它是否会 return 一个 Array
,并安全地忽略任何像 join()
这样的方法,以防它 returns null
?
简单的解决方案是在有效情况下 return 空 Array
而不是 null
,但假设我无法更改它。
可以间接完成。
以下代码源自HERE,我添加了一些代码进行测试。
感谢原作者 Djamel Hassaine。
{
class test {
constructor () {
this.in = 0;
}
sum ( a, b ) {
this.in += a + b;
return this;
}
}
let k = new test();
function traceMethodCalls(obj) {
const handler = {
get(target, propKey, receiver) {
console.log( target, propKey, receiver );
console.log( this );
console.log( handler === this );
const targetValue = Reflect.get(target, propKey, receiver);
if (typeof targetValue === 'function') {
return function (...args) {
console.log('CALL', propKey, args);
console.log( this );
console.log( this === receiver );
return targetValue.apply(this, args); // (A)
}
} else {
return targetValue;
}
}
};
return new Proxy(obj, handler);
}
let l = traceMethodCalls( k );
console.log( l.sum( 1, 2 ) );
console.log( l );
console.log( l.sum( 1, 2 ) );
console.log( l );
}
另一种方式:
User.validators.getEmailErrorsOriginal = User.validators.getEmailErrors
User.validators.getEmailErrors = function ( ...args ) {
return ( this.getEmailErrorsOriginal( ...args ) || [] );
}
(getEmailErrors() || []).join(',')
这是您要找的吗?它不是很干净,但肯定很短...
我正在使用 API,它 return 是一种在用户提交数据之前验证表单的架构。
例如,架构有一个 User
class,具有名为 email
的属性。如果有错误,User.validators.getEmailErrors()
return 是所有错误的 Array
,例如['Email address cannot be blank', 'Email addresses must match']
.
但是,如果字段有效,并且没有发现错误,getEmailErrors()
returns null
.
在我的应用中,我想安全地链接 getEmailErrors()
中的更多方法,例如getEmailErrors().join(',')
,但没有事先检查 null
。相反,有没有办法,例如使用 ES6 代理,让 getEmailAddress()
知道它是否会 return 一个 Array
,并安全地忽略任何像 join()
这样的方法,以防它 returns null
?
简单的解决方案是在有效情况下 return 空 Array
而不是 null
,但假设我无法更改它。
可以间接完成。
以下代码源自HERE,我添加了一些代码进行测试。
感谢原作者 Djamel Hassaine。
{
class test {
constructor () {
this.in = 0;
}
sum ( a, b ) {
this.in += a + b;
return this;
}
}
let k = new test();
function traceMethodCalls(obj) {
const handler = {
get(target, propKey, receiver) {
console.log( target, propKey, receiver );
console.log( this );
console.log( handler === this );
const targetValue = Reflect.get(target, propKey, receiver);
if (typeof targetValue === 'function') {
return function (...args) {
console.log('CALL', propKey, args);
console.log( this );
console.log( this === receiver );
return targetValue.apply(this, args); // (A)
}
} else {
return targetValue;
}
}
};
return new Proxy(obj, handler);
}
let l = traceMethodCalls( k );
console.log( l.sum( 1, 2 ) );
console.log( l );
console.log( l.sum( 1, 2 ) );
console.log( l );
}
另一种方式:
User.validators.getEmailErrorsOriginal = User.validators.getEmailErrors
User.validators.getEmailErrors = function ( ...args ) {
return ( this.getEmailErrorsOriginal( ...args ) || [] );
}
(getEmailErrors() || []).join(',')
这是您要找的吗?它不是很干净,但肯定很短...