Подтвердить что ты не робот

Как проверить, существует ли свойство на объекте перед его чтением?

Я пытаюсь прочитать свойство в серии спрайтов. Это свойство может присутствовать или не присутствовать на этих объектах и ​​даже не может быть объявлено хуже, чем 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
}
4b9b3361

Ответ 1

Объекты в AS3 имеют метод hasOwnProperty, который принимает строковый аргумент и возвращает true, если объект имеет это свойство.

if(myObj.hasOwnProperty("someProperty"))
{
    // Do something
}

Ответ 2

if ("readable" in child) {
  ...

Ответ 3

Добавление этого, поскольку это лучший ответ в Google.

Если вы пытаетесь проверить, существует ли константа с использованием строки для имени, используйте

if (ClassName["ConstName"] !== undefined) {
    ...
}

Ответ 4

Попробуйте что-то вроде этого:

if (child["readable"] != null){

}

Ответ 5

Ответ на @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