Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2017, 21:21
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Добавление метода Объекту в контексте window
Случай 1:
console.log( {}.toString() )

Случай 2:
{}.toString()

Почему во втором случае Синтаксическая ошибка, а в первом нет?

Можно ли добавить свой метод объекту:
Object.prototype.show=function(){console.log(this)};

// Использование:
{key:0}.show()
Почему-то для массива ошибки нет:
[4,8,15].map(i=>console.log(i))

Хотя массив тоже объект
Ответить с цитированием
  #2 (permalink)  
Старый 14.08.2017, 00:03
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Сообщение от Teamur
Хотя массив тоже объект
Чушь и бред

Сообщение от Teamur
Почему во втором случае Синтаксическая ошибка, а в первом нет?
Потому что у object есть метод .toString() а у undefined такого метода нет

В джава скрипт используют автомагическое приведение типов
небольшой пример
alert ("первый пример «{}  » = " + eval (  "{}" ) + " . . . тип данных = "+ (typeof eval("{}"  )) );
alert ("второй  пример «+{}» = " + eval ("+{}") + " . . . тип данных = "+ (typeof eval("+{}")) );
alert ("третий  пример «({})» = " + eval ("({})") + " . . . тип данных = "+ (typeof eval("({})")) );
Ответить с цитированием
  #3 (permalink)  
Старый 14.08.2017, 00:21
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Правильно ли я понимаю, что пока я не присвоил объект в какую-нибудь переменную, я не смогу применить свой метод?

А случай 1 работает потому что вызов {}.toString() становится параметром функции console.log, что равно присвоению.
Ответить с цитированием
  #4 (permalink)  
Старый 14.08.2017, 01:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от Teamur
{}.toString();
тут прикол в том, что фигурные скобки рассматриваются не как объект, а как "блок действий" - https://javascript.ru/Blok

чтобы {} были объектом, выражение не должно начинаться с {
например:
({}).toString()

обернули в скобки, и жизнь наладилась.

Похожая тема с функциями. Если выражение начинается с function, то это считается FD, иначе FE: https://learn.javascript.ru/function...on-declaration
Ответить с цитированием
  #5 (permalink)  
Старый 14.08.2017, 06:54
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Teamur,
Есть Statements and declarations, где {} это block statement, и есть Expressions and operators, где {} это object initializer, т.е. интерпретатор js может по разному оценивать некоторые нотации в зависимости от контекста Statements vs Expressions, Expressions могут быть на месте Statements, а наоборот нет.

Последний раз редактировалось Rise, 14.08.2017 в 06:58.
Ответить с цитированием
  #6 (permalink)  
Старый 14.08.2017, 18:23
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Спасибо, товарищи!
Тогда объясните пожалуйста как работает:
console.log({}.toString())


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

При этом в console.log объект не оборачивается в скобки.
Вместо ({}).toString()
там просто {}.toString()
Это срабатывает и в консоли мы видим [object Object]

Наверное для метода toString сделали исключение

Последний раз редактировалось Teamur, 14.08.2017 в 18:37.
Ответить с цитированием
  #7 (permalink)  
Старый 14.08.2017, 18:28
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Скорее всего тут дело в области видимости!
В глобальной области не работает, так как интерпретатор определяет фигурные скобки как блок!

Гениально
Ответить с цитированием
  #8 (permalink)  
Старый 14.08.2017, 18:35
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Teamur,

"console.log({}.toString())" - это все выражение полностью.
{} находится внутри выражения, а не вначале. Потому рассматривается как объект, а не блок действий.

к области видимости никакого отношения не имеет.
Ответить с цитированием
  #9 (permalink)  
Старый 14.08.2017, 18:57
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Alexandroppolus,
теперь я все понял!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как закрыть доступ к глобальному объекту window? m00 Общие вопросы Javascript 12 26.08.2011 08:59
Применение метода к объекту Kiomot jQuery 1 11.07.2011 16:14
Как получить список пользовательских функций объекта window? Маэстро Events/DOM/Window 13 03.07.2010 13:20
Добавление метода к функции YISHIMITSY Общие вопросы Javascript 2 17.02.2010 12:49