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
jm: прав си. Вече го смених.   -  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 на обект) дава [title] и console.log 'width od обект дава 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
@Aldo Ах, съжалявам; опитайте JSON.stringify(object) вместо object.toString(). - person Trevor Burnham; 01.12.2011
comment
JSON.stringify показва само атрибут за заглавие. console.log обектът показва останалото. Височина на обекта: 600 заглавие: Банер за Creative Ширина: 160 proto: Обект {title:Banner for Creative} - person Aldo; 01.12.2011
comment
Благодаря на Тревър за отделеното време за това. Все още търся решение. - person Aldo; 01.12.2011
comment
И console.log width веднага след това ви дава undefined? Хм. Тогава изглежда, че все пак не е проблем с асинхронизацията. Възможно ли е (и тук навлизам в невероятна територия) един от 'width' низовете, които използвате, да включва уникод знаци? Опитайте да копирате и поставите този от конзолата в кода си. Предполагам, че друга възможност е да сте задали Number::toString() да връща undefined... хех. Опитайте console.log typeof object.width. - person Trevor Burnham; 01.12.2011
comment
@Trevor console.log width дава грешка. няма уникод знаци там само числа. и 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