Непонятное переназначение объекта в javascript

Я смотрел примеры этого игрового движка, и я действительно не понимаю, почему он переназначает объект, я кодирую на java и изучаю javascript, это может быть ошибка концепции.

пример https://blacksmith2d.io/Docs/Examples/Arcade-Physics/CollisionEvents

onassetsLoaded() он устанавливает свойства объекта, а затем снова переназначает их ниже.

this.arcade = arcade;
this.circle = circle;
this.box = box;

также я не понимаю эту часть оператора if

!this.circle 
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Java и Javascript так же похожи, как автомобиль и ковер https://stackoverflow.com/a/245068/1897495 :-). Знания, которые вы приобрели в Java, не могут быть перенесены напрямую.

В отличие от Java, доступ к свойствам объектов в Javascript явный: использование this. обязательно. То же самое происходит при вызове методов из одного класса (нужно использовать this.)

class SomeClass {
   constructor() {
       this.param1 = 42;
   }

   localAndParameter(param1) {
       console.info(this.param1); // prints "42"
       console.info(param1); // prints "666"
   }

   localAndGlobal() {
       console.info(this.param1); // still "42"
       console.info(param1); // prints 123
   }

   callMethods() {
       this.emptyMethod(); // this works
       emptyMethod(); // This would raise an exception if called
       // "emptyMethod" is undefined or something like that
   }

   emptyMethod() {
   }
}

const param1 = 123;
const obj = new SomeClass();
obj.localAndParameter(666);
obj.localAndGlobal();

Также язык динамичен.

Свойства могут быть добавлены к объектам в любое время, а не только при объявлении/создании.

class SomeClass {
   constructor() {
       // no properties created.
   }

   someMethod() {
       // everything is dynamic! I can create a property here
       this.newProperty = 23;
   }
}

const obj = new SomeClass()
console.info(obj.newProperty); // prints "undefined"
obj.someMethod();
console.info(obj.newProperty); // prints "23"

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

G-programmer 20.12.2020 15:10

Я думаю, что путаница с OP просто происходит из-за непонимания того, что this.something и something не совпадают в Javascript (что имеет место в Java)

Eloims 20.12.2020 15:24

да, вы правы, я думал о java, поэтому я не понимаю эту концепцию

G-programmer 20.12.2020 16:03
Ответ принят как подходящий

Об этих утверждениях:

this.arcade = arcade;
this.circle = circle;
this.box = box;

Ранее в этом блоке кода все переменные, встречающиеся справа, были определены как локальные переменные (локальные для метода onAssetsLoaded):

const arcade = ...
const circle = ...
const box = ...

Таким образом, задания, которые вас интересуют, на самом деле копируют ссылки из локальных переменных в переменные экземпляра (т.е. свойства). Это необходимо, чтобы не потерять эту информацию после завершения вызова onAssetsLoaded.

Что касается этого выражения:

!this.circle 

Оператор not (!) можно использовать в любом выражении. Он оценивается как true, когда операнд «ложный». В JavaScript такие значения, как undefined, null, 0, "", NaN, считаются «ложными», в то время как все объекты считаются «истинными». Здесь он используется для обнаружения того, что this.circle не было присвоено правильное значение, т. е. это будет означать, что onAssetsLoaded еще не вызывался, а this.circle все еще был undefined.

использование этого в javascript означает, что локальная переменная применяется глобально, это правильно? , я думал в java.

G-programmer 20.12.2020 16:02
this — это объект. Он может получить свойства. this.a = 1 присвоит значение свойству объекта this. Если у вас также есть переменная с именем a, знайте, что это не синоним this.a. Если эта переменная a является локальной, и вы хотите не потерять эту информацию после того, как она выйдет за пределы области видимости, вам нужно скопировать ее во что-то, к чему можно получить доступ из другого места, например this.a. Можно многое сказать о this, так как он не всегда действует так же, как в Java. Посмотрите очень познавательный Как работает это ключевое слово.
trincot 20.12.2020 18:17

хорошо, я проверяю этот URL, в любом случае я даю ваш ответ как правильный.

G-programmer 20.12.2020 19:05

Другие вопросы по теме