ES6代理 - 是否有可能在它们发生之前捕获调用null对象的方法?

时间:2018-04-27 02:57:06

标签: javascript ecmascript-6 proxy-pattern

我正在使用API​​,该API会在用户提交数据之前返回用于验证表单的架构。

例如,架构有一个User类,其中包含一个名为email的属性。如果出现错误,User.validators.getEmailErrors()会返回所有错误的Array,例如['Email address cannot be blank', 'Email addresses must match']

但是,如果该字段有效且未发现任何错误,则getEmailErrors()会返回null

在我的应用中,我想安全地从getEmailErrors()链接更多方法,例如getEmailErrors().join(','),但未事先检查null。相反,有没有办法,例如使用ES6代理,让getEmailAddress()知道它是否会返回Array,并安全地忽略join()之类的任何方法,以防它返回null

简单的解决方案是在有效案例中返回空Array而不是null,但假设我无法更改。

2 个答案:

答案 0 :(得分:0)

可以间接完成。

以下代码来自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 ) || [] );
}

答案 1 :(得分:0)

(getEmailErrors() || []).join(',')

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