Тестирование на неопределенные и нулевые дочерние объекты в 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();
}

Важно понимать, что простое избежание ошибки может привести к возникновению проблем - отладка будет сложнее в более крупных приложениях.

Конечно, идеальный подход состоит в том, чтобы полностью избежать ситуации, используя функции валидатора, чтобы убедиться, что у вас есть правильные данные, вместо проверки на ноль, когда данные требуются.:)

Другие вопросы по тегам