Тестирование на неопределенные и нулевые дочерние объекты в ActionsScript/Flex
Я использую этот шаблон для проверки неопределенных и нулевых значений в ActionScript/Flex:
if(obj) {
execute()
}
К сожалению, ReferenceError всегда генерируется, когда я использую шаблон для проверки дочерних объектов:
if(obj.child) {
execute()
}
ReferenceError: Error #1069: Property child not found on obj and there is no default value.
Почему тестирование дочерних объектов с помощью операторов if вызывает ReferenceError?
Спасибо!
3 ответа
Вы получаете эту ошибку, потому что тип объекта не имеет дочернего свойства. Вам нужно сделать что-то вроде этого:
if((obj) && (obj.hasOwnProperty('child') && (obj.child)){
execute()
}
Дополнительная информация о методе hasOwnProperty в классе Object: http://livedocs.adobe.com/flex/3/langref/Object.html.
Это происходит когда obj
является строго типизированным объектом, но не имеет child
поле.
Вы можете проверить, существует ли поле на каком-либо объекте, используя in
оператор:
if ("foo" in obj && obj.foo)
execute();
Я также написал вспомогательную функцию, чтобы сделать этот процесс проще:
function getattr(obj:Object, field:*, dflt:*=undefined):* {
if (field in obj && obj[field])
return obj[field];
return dflt;
}
Вы можете избежать ошибок ссылок, используя обозначение массива:
if([obj.name][child.name]){
execute();
}
Важно понимать, что простое избежание ошибки может привести к возникновению проблем - отладка будет сложнее в более крупных приложениях.
Конечно, идеальный подход состоит в том, чтобы полностью избежать ситуации, используя функции валидатора, чтобы убедиться, что у вас есть правильные данные, вместо проверки на ноль, когда данные требуются.:)