Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.06.2016, 18:38
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Как переопределить undefine которое возвращает несуществующее свойство?
Нужно создать объект, который будет возвращать, например, null вместо undefined при запросе несуществующего свойства.
Ответить с цитированием
  #2 (permalink)  
Старый 08.06.2016, 19:00
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

let obj = {
	"a": 1,
	"b": 2
};

obj = new Proxy(obj, {
  get(target, prop) {
  return prop in target ? target[prop] : null
  }
})

alert( obj['a'] ); //1
alert( obj['qqqqq'] ); //null
Ответить с цитированием
  #3 (permalink)  
Старый 08.06.2016, 19:44
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

destus, это конечно всё хорошо, но поддержка плохая.

Shitbox2, а чем undefined не вариант?
Ответить с цитированием
  #4 (permalink)  
Старый 08.06.2016, 23:08
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

class Foo {
  constructor() {
    this.__x = 1;
    this.__y = 2;
  }
  get (key) {
    let k = `__${key}`;
    return k in this ? this[k] : null;
  }
  set (key, value) {
    let k = `__${key}`;
    this[k] = value;
  }
}

let object = new Foo();
alert(object.get('x'));
alert(object.get('z'));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 09.06.2016, 09:36
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Спасибо! Попробую!

Эта штука должна в валидаторах выводить сообщение по-умолчанию. Если валидатор вернет undefined это будет считаться успешной валидацией. Можно, конечно, в каждом валидаторе писать что-то типа
return options.message || defaults.message
но как-то слишком много копипаста)
Ответить с цитированием
  #6 (permalink)  
Старый 09.06.2016, 09:52
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Shitbox2, тогда еще проще
function modifier(any) {
	return any === undefined ? null : any;
}

function isValid(any) {
	return modifier(any);
}

alert(isValid(0));
alert(isValid(1));
alert(isValid(undefined));


Я бы так сделал
function isUndefined(any) {
	return any === undefined;
}

function Validator({message}) {
	this.message = isUndefined(message) ? null : message;
}

let validator1 = new Validator({message:'test'});
let validator2 = new Validator({message: undefined});
let validator3 = new Validator({});

alert(validator1.message);
alert(validator2.message);
alert(validator3.message);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 09.06.2016, 10:16
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

destus, Proxy действительно даже Babel не поддерживает(

nerv_, зачем такие сложности?
function Foo() {}

Foo.prototype.get = function(key) {
    return key in this ? this[key] : null;
};

const object = Object.assign(new Foo(), {x: 1, y: 2});

alert(object.get('x'));
alert(object.get('z'));
Ответить с цитированием
  #8 (permalink)  
Старый 09.06.2016, 10:24
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

nerv_, не увидел предыдущий ответ сразу) Так не получится. Валидатор имеет примерно такой код:
if (isValid(value)) {
   return undefined/null/0/''
} else {
   return options[поле, где хранится сообщение об ошибке]
}

Т.е. у нас единственная зацепка это то, что сообщение является полем в options, а объект options (как и обертку над валидатором) мы создаем сами (пользователь лишь записывает в него свойства)

Последний раз редактировалось Shitbox2, 09.06.2016 в 10:27.
Ответить с цитированием
  #9 (permalink)  
Старый 09.06.2016, 11:17
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Shitbox2, автоматизировать не получится, только вручную.

function modifier(value) {
    return value === void 0 ? null : value;
}



alert(modifier(1));
alert(modifier(false));
alert(modifier(undefined));


Ну или юзать Proxy/Object.observe, но у них поддержка плохая.
Ответить с цитированием
  #10 (permalink)  
Старый 09.06.2016, 11:41
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Раз не получается просто, сделал примерчик. Может быть еще какие-то способы есть?
//Пользовательский валидатор. Мы не можем его контролировать и название поля с сообщением мы не знаем
function isMax(value, options) {
    if (value > options.max) {
        return options.maxMessage;
        // return options.maxMessageXXX //поле с сообщением может не существовать
        // return 'Плохое число' //вернул свое сообщение
    }
}

//Наша обертка. Здесь мы можем подменить options
function validateMax(value, options) {
    var result = isMax(value, options);

    if (!result) {
        return 'Валидно'
    }
    return result;
}

alert(validateMax(3, {max: 2, maxMessage: 'Слишком большое'}));
alert(validateMax(3, {max: 2})); //Неверное поведение
alert(validateMax(1, {max: 2, maxMessage: 'Слишком большое'}));

Последний раз редактировалось Shitbox2, 09.06.2016 в 11:44.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если селектор возвращает массив узлов, как работать с каждым по отдельности? балерун jQuery 7 15.02.2011 12:42
Как удалить свойство объекта? miha-ha Общие вопросы Javascript 2 23.09.2010 15:10
JSON. Как в callback функции изменить свойство объекта? master_alf jQuery 10 22.04.2010 17:08
Объект как свойство объекта Cooskon Общие вопросы Javascript 6 16.02.2010 21:41
Как установить свойство родительской страницы после запуска 2х последов. popup окон? ksl Events/DOM/Window 10 23.08.2009 14:06