Как проверить, существует ли свойство объекта перед чтением его значения? - PullRequest
27 голосов
/ 02 мая 2010

Я пытаюсь прочитать свойство на серии спрайтов. Это свойство может присутствовать или не присутствовать в этих объектах и ​​даже не может быть объявлено, что хуже, чем нулевое значение.

Мой код:

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
}

Ответы [ 5 ]

55 голосов
/ 02 мая 2010

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

if(myObj.hasOwnProperty("someProperty"))
{
    // Do something
}
18 голосов
/ 02 мая 2010
if ("readable" in child) {
  ...
1 голос
/ 13 декабря 2012

Добавим это, так как это лучший ответ в Google.

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

if (ClassName["ConstName"] !== undefined) {
    ...
}
0 голосов
/ 06 декабря 2015

Ответ на @Vishwas G (не комментарий, потому что блоки кода не поддерживаются в комментариях):

Как указал Даниэль, если объект "a" в вашем примере не существует в первую очередь, ваша попытка получить доступ к "b" на "a" приведет к ошибке. Это происходит в тех случаях, когда вы ожидаете глубокую структуру, такую ​​как объект JSON, который может, например, иметь формат «content.social.avatar». Если «social» не существует, то попытка доступа к «content.social.avatar» приведет к ошибке.

Вот пример общего случая теста существования свойства глубокой структуры, где «неопределенный» подход может вызвать ошибку в случаях, когда подход «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's type checker generates an error.)
trace(test1.a.b.c);  
// Outputs: world
trace(test2.a.b.c);  

// ** Error **. (Because although "b" exists, there's 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
0 голосов
/ 02 мая 2010

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

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

}
...