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(',')

这是您要找的吗?它不是很干净,但肯定很短...