Как JS оценивает выражение ({}).objMethod()?

Из моих ограниченных знаний о том, как выражения оцениваются в JS, в приведенном ниже коде я знаю, что скобки заставляют JS-движок оценивать все, что находится внутри скобок, как выражение ({..}), поэтому ({..}) это будет оцениваться как объект {...}, возвращаемый в глобальную область (в данном случае ‹‹ Прав ли я? Пожалуйста, поправьте меня, если нет) или любую другую область действия, в которой находится выражение.

Но чего я не понимаю, так это того, как функция приветствия ({...}).greet() оценивается в области/контексте возвращаемого объекта из выражения ({..}). Как правило, по крайней мере, я бы присвоил возвращаемое значение выражения переменной/ссылке на возвращенный объект, а затем вызвал метод приветствия() этого объекта, как в

var x = ({...})
x.greet()

затем, как оценивается следующий код.

({
  name: "John Doe",
  data: {
    message: "Hello World"
  },
  greet: function(){
    console.log("I am " + this.name);
    console.log("I have a message for you: " + this.data.message);
  }
}).greet();

Спасибо


person appu    schedule 01.09.2019    source источник


Ответы (1)


Как и следовало ожидать, он просто оценивает объект, а затем вызывает для него метод greet. Это вот так:

console.log({ foo: 1 }.foo);

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

person Jack Bashford    schedule 01.09.2019
comment
Как вы говорите, просто оценивая объект, затем вызывая для него метод приветствия. Теперь мы фактически назначаем переменную/имя для ссылки на возвращаемый объект, а затем вызываем метод через эту переменную, myObj.greet(), но здесь ссылка/имя не назначается . Назначает ли JS динамически скрытое имя/адрес памяти возвращаемому объекту, чтобы вызываемый метод знал о его контексте. Кроме того, как получить доступ к возвращенному объекту, не назначая его переменной, т.е. var obj = ({...}) Кстати, ваш пример без круглых скобок не работает. Консоль Chrome выдает Uncaught syntaxError: unexpected token . - person appu; 01.09.2019
comment
У меня отлично работает @appu. - person Jack Bashford; 02.09.2019