Coffeescript/Javascript - почему атрибут объекта не определен?

У меня есть эта функция, которую я использую в проекте Rails 3.1:

setPosition: (object) ->
    console.log object
    console.log object.width
    object["position"] = [500, 50] 
    this

console.log object дает

Object
    height: 600
    position: Array[2]
    title: "Banner for Creative"
    width: 160
    __proto__: Object

но console.log object.width не определено. Почему ?


person Aldo    schedule 01.12.2011    source источник
comment
Пожалуйста, не называйте свои переменные object, используйте более описательное имя, которое позволяет избежать двусмысленности с собственными объектами.   -  person jaime    schedule 01.12.2011
comment
Это случайно не в хроме?   -  person Crescent Fresh    schedule 01.12.2011
comment
джм: ты прав. Я уже поменял.   -  person Aldo    schedule 01.12.2011
comment
такое же поведение в Firefox   -  person Aldo    schedule 01.12.2011
comment
Не могли бы вы добавить результаты для console.log (x for x of object) и console.log 'width' of object? Возможно, есть небольшая проблема со строкой, например, имя ключа имеет нулевой символ в конце. Смотрите мой ответ на другой вопрос сегодня: stackoverflow.com/a/8344503/66226   -  person Trevor Burnham    schedule 01.12.2011
comment
@TrevorBurnham console.log (x вместо x объекта) дает [название], а console.log 'ширина объекта дает false   -  person Aldo    schedule 02.12.2011


Ответы (1)


Я ответил на аналогичный вопрос всего пару дней назад: https://stackoverflow.com/a/8299394/66226

По сути, console.log имеет некоторое асинхронное поведение (в некоторых средах). Поэтому, когда вы передаете ссылку на объект, этот объект преобразуется в строку позже, тогда как object.width сейчас равен undefined.

Если вы сделаете

console.log object.toString()

тогда вы должны получить более последовательные результаты (хотя и менее красивые).

Изменить: или еще лучше,

console.log JSON.stringify(object)

Смотрите комментарии ниже.

person Trevor Burnham    schedule 01.12.2011
comment
+1 - я предполагал, что он получил сообщение об ошибке. Я никогда не думал, что у console.log могут быть такие проблемы. - person Adam Rackis; 01.12.2011
comment
Адам, я не получаю сообщение об ошибке, просто "не определено". Но если я попытаюсь напрямую получить доступ к ширине или высоте (например, object.height), то же самое поведение. - person Aldo; 01.12.2011
comment
console.log object.toString() дает [object Object] - person Aldo; 01.12.2011
comment
@ Альдо А, извини; попробуйте JSON.stringify(object) вместо object.toString(). - person Trevor Burnham; 01.12.2011
comment
JSON.stringify показывает только атрибут title. Объект console.log показывает остальное. Высота объекта: 600 title: Баннер для креатива Ширина: 160 прото: Объект {title:Баннер для креатива} - person Aldo; 01.12.2011
comment
Спасибо, Тревор, что уделил этому время. Все еще ищу решение. - person Aldo; 01.12.2011
comment
И console.log width сразу после этого дает вам undefined? Хм. Тогда кажется, что это не проблема асинхронности. Возможно ли (и я вхожу в невероятную территорию здесь), что одна из строк 'width', которые вы используете, может включать символы Unicode? Попробуйте скопировать+вставить код из консоли в свой код. Я предполагаю, что другая возможность заключается в том, что вы установили Number::toString() для возврата undefined... хех. Попробуйте console.log typeof object.width. - person Trevor Burnham; 01.12.2011
comment
Ширина @Trevor console.log выдает ошибку. там нет символов Юникода, только цифры. и console.log typeof object.width также не определен. Я думал, что это может быть проблема области, но первый объект console.log дает все атрибуты. Так странно. - person Aldo; 02.12.2011
comment
@Aldo А, я неправильно прочитал ваш пост о том, что показывает JSON.stringify — это это проблема с асинхронностью! Мой ответ, как написано выше, правильный. Все, кроме console.log object, показывает истинное состояние объекта во время console.log; console.log object сохраняет ссылку на объект, а затем отображает ее позже, после заполнения полей объекта. Используйте JSON.stringify, если хотите избежать путаницы! Имеет смысл? - person Trevor Burnham; 02.12.2011
comment
@Travor Да! ты прав. это асинхронная проблема. Я передал async: false в ajaxOptions для вызова AJAX, и это, наконец, сработало. Еще раз спасибо за ваше время. - person Aldo; 02.12.2011