ES6 Proxies - возможно ли захватывать методы, вызываемые для нулевого объекта, до того, как они произойдут? - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю с 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 голосов
/ 27 апреля 2018
(getEmailErrors() || []).join(',')

Это то, что вы ищете? Это не очень чистый, но, конечно, короткий ...

0 голосов
/ 27 апреля 2018

Это можно сделать косвенно.

Следующий код был взят из ЗДЕСЬ , и я добавляю некоторый код для тестирования.

Спасибо за оригинального автора, 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 ) || [] );
}
...