Ответ 1
Объекты в AS3 имеют метод hasOwnProperty
, который принимает строковый аргумент и возвращает true
, если объект имеет это свойство.
if(myObj.hasOwnProperty("someProperty"))
{
// Do something
}
Я пытаюсь прочитать свойство в серии спрайтов. Это свойство может присутствовать или не присутствовать на этих объектах и даже не может быть объявлено хуже, чем null.
Мой код:
if (child["readable"] == true){
// this Sprite is activated for reading
}
Итак, Flash показывает мне:
Ошибка # 1069: Выбор свойства не найден на flash.display.Sprite и нет значения по умолчанию.
Есть ли способ проверить, существует ли свойство перед чтением его значения?
Что-то вроде:
if (child.isProperty("readable") && child["readable"] == true){
// this Sprite is activated for reading
}
Объекты в AS3 имеют метод hasOwnProperty
, который принимает строковый аргумент и возвращает true
, если объект имеет это свойство.
if(myObj.hasOwnProperty("someProperty"))
{
// Do something
}
if ("readable" in child) {
...
Добавление этого, поскольку это лучший ответ в Google.
Если вы пытаетесь проверить, существует ли константа с использованием строки для имени, используйте
if (ClassName["ConstName"] !== undefined) {
...
}
Попробуйте что-то вроде этого:
if (child["readable"] != null){
}
Ответ на @Vishwas G (не комментарий, поскольку в комментариях коды кода не поддерживаются):
Как отметил Даниил, если объект "a" в вашем примере не существует в первую очередь, ваша попытка доступа к "b" на "a" вызовет ошибку. Это происходит в тех случаях, когда вы ожидаете глубокую структуру, например объект JSON, который может иметь, например, формат "content.social.avatar". Если "social" не существует, тогда попытка доступа к "content.social.avatar" приведет к ошибке.
Здесь приведен общий пример теста существования свойства глубокой структуры, где подход "undefined" может вызвать ошибку в случаях, когда подход "hasOwnProperty()" не имеет значения:
// Missing property "c". This is the "invalid data" case.
var test1:Object = { a:{b:"hello"}};
// Has property "c". This is the "valid data" case.
var test2:Object = { a:{b:{c:"world"}}};
Теперь тесты...
// ** Error ** (Because "b" is a String, not a dynamic
// object, so ActionScript type checker generates an error.)
trace(test1.a.b.c);
// Outputs: world
trace(test2.a.b.c);
// ** Error **. (Because although "b" exists, there no "c" in "b".)
trace(test1.a && test1.a.b && test1.a.b.c);
// Outputs: world
trace(test2.a && test2.a.b && test2.a.b.c);
// Outputs: false. (Notice, no error here. Compare with the previous
// misguided existence-test attempt, which generated an error.)
trace(test1.hasOwnProperty("a") && test1.a.hasOwnProperty("b") && test1.a.b.hasOwnProperty("c"));
// Outputs: true
trace(test2.hasOwnProperty("a") && test2.a.hasOwnProperty("b") && test2.a.b.hasOwnProperty("c"));
Обратите внимание, что родной язык ActionScript JavaScript не генерирует ошибку в примере test1. Однако, если вы увеличите иерархию объектов на еще один уровень, вы также столкнетесь с ошибками в JavaScript:
// ** Error (even in JavaScript) ** because "c" doesn't even exist, so
// test1.a.b.c.d becomes an attempt to access a property on undefined,
// which always yields an error.
alert(test1.a.b.c.d)
// JavaScript: Uncaught TypeError: Cannot read property 'd' of undefined