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

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

Мой код:

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
}

person Robin Rodricks    schedule 02.05.2010    source источник


Ответы (5)


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

if(myObj.hasOwnProperty("someProperty"))
{
    // Do something
}
person Greg B    schedule 02.05.2010

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

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

if (ClassName["ConstName"] !== undefined) {
    ...
}
person SystemicPlural    schedule 13.12.2012

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

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

}
person smartali89    schedule 02.05.2010
comment
это может вызвать ошибки, если оно не существует изначально. вы увидите ошибку, если вы создаете объект динамически, например, ищете [b] в var a:Object = {a:'1'} - person Daniel; 22.03.2013
comment
вар а ; а = а {а: 1} ; trace(a[b]) выводит undefined , но не выдает никакой ошибки. Итак, в чем проблема использовать этот способ? - person Vishwas; 16.08.2014

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

Как указал Даниэль, если объект «a» в вашем примере вообще не существует, ваша попытка доступа к «b» на «a» вызовет ошибку. Это происходит в тех случаях, когда вы ожидаете глубокую структуру, такую ​​как объект JSON, который может, например, иметь формат «content.social.avatar». Если «социальный» не существует, то попытка доступа к «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
person colin moock    schedule 06.12.2015

person    schedule
comment
Есть ли разница/недостаток в использовании вместо hasOwnProperty? - person OMA; 03.10.2018
comment
@OMA Если readable определено в прототипе child вместо самого экземпляра, то hasOwnProperty вернет false (например, document.hasOwnProperty('getElementById') === false, а ('getElementById' in document) === true) - person kennytm; 03.10.2018