Почему это свойство объекта не определено? - PullRequest
11 голосов
/ 28 октября 2011

Рассмотрим код ниже. Первый console.log правильно регистрирует изображение, и вы можете увидеть его свойства на изображении ниже. Тем не менее, когда я пытаюсь зарегистрировать один из его свойств в консоли, я получаю undefined!

console.log(that.data[0].cards); //works -- see image below
console.log(that.data[0].cards.E); //undefined
console.log(that.data[0].cards['E']); //undefined
console.log(that.data[0].cards.hasOwnProperty('E')); //false

var test = JSON.stringify(that.data[0]);
console.log(test); // {}

for( var key in that.data[0].cards ) {
    console.log('hello????') //doesn't appear in the console
}

console.log( Object.keys( that.data[0].cards ) ); //[]
console.log( that.data[0].cards.propertyIsEnumerable("E") ); //false
console.log( that.data[0].cards.__lookupGetter__( "E" ) ); //undefined

Результат в консоли:

enter image description here

Есть идеи, что здесь происходит? Свойство xml внутри that.data[0] также должно иметь свойства внутри него, которые фактически называются такими же, как свойства в cards.

FWIW, я получаю то же самое в Firebug (изображение консоли выше Chrome).

Ответы [ 2 ]

12 голосов
/ 28 октября 2011

Я решил проблему. По сути, рассматриваемый объект (that.data[0].cards) имеет свои свойства, созданные функцией a(), которая запускается после обработки всех запросов AJAX на необходимые файлы XML. Я разрешаю выполнение запросов асинхронно, используя счетчик для определения в функции обратного вызова success, следует ли еще вызывать a().

После запуска a() функция b() должна выполнять операции с that.data[i].cards. Однако b() работал до вызова a() из-за зависимости a() от асинхронных запросов. Таким образом, решение было просто сделать a() вызов b().

Так что это оказалось довольно простой ошибкой с моей стороны. Что сбивало с толку, так это то, что регистрация that.data[0].cards на консоли показала мне, что на самом деле объект cards уже построен, хотя на самом деле это еще не было. Поэтому консоль предоставляла мне неверную или, по крайней мере, неясную информацию.

Спасибо всем за помощь прошлой ночью! Всего голосов: :)

7 голосов
/ 28 октября 2011

Я думаю, что ключи объекта имеют непечатаемые символы, такие можно повторить следующим образом:

var obj = {};
obj["E"+String.fromCharCode(15)] = new Array(15);

console.log(obj);

/*Object
E: Array[15]
__proto__: Object*/

console.log(obj.E)

//undefined

console.log( obj["E"+String.fromCharCode(15)] )

//[]

Редактировать: вы можете увидеть, так ли это для ваших ключей объекта:

var realKeys = [];

for( var key in obj ) {
realKeys.push( [].slice.call( key ).map( function(v){return v.charCodeAt(0);} ).join(" ") );
}

//["69 15"] (69 stands for the letter "E" and 15 was the unprintable character I added manually)

Edit2: так как вы не можете сделать это, я нашел другой способ проверить, есть ли непечатаемые символы:

Скопируйте и вставьте строку ключа следующим образом: (Пройдите как можно больше на обоихзаканчивается, поэтому вы выбираете любые невидимые символы)

image

Затем сбросьте свой буфер обмена следующим образом (убедитесь, что вы используете двойные кавычки):

image

...