В чем разница в использовании этих двух синтаксиса JavaScript OOP?

Итак, я создал объект двумя разными способами.

Первый способ:

const sprite = () => {
    let obj = {
        hp: 100,
        damage: () => {
            obj.hp -= 25;
        },
        heal: () => {
            obj.hp += 25;
        }
    }
    return obj;
}

let sprite1 = sprite();

Второй способ:

const sprite = () => {

    let obj = {};

    obj.hp = 100;

    obj.damage = () => {
        obj.hp -= 25;
    }

    obj.heal = () => {
        obj.hp += 25;
    }

    return obj;
}

let sprite1 = sprite();

Я протестировал оба этих синтаксиса, и они оба работают, но я вижу, что чаще используется только второй способ.

Итак, мой вопрос:

Можно ли использовать синтаксис первым способом? Есть ли причина, по которой синтаксис первого способа не используется широко? Это плохая практика, если да, то почему?

Я просто немного новичок в ООП в JS и ищу некоторые разъяснения.

Спасибо!

Во-первых: вы создаете глубокий объект, во-вторых: вы создаете объект, а затем добавляете к нему свойства/значения. В остальном нет никакой разницы.

kemicofa ghost 17.01.2019 23:01

Я совершенно уверен, что эти два объекта идентичны.

Herohtar 17.01.2019 23:01

Я думаю, что более подход ООП будет заключаться в использовании class.

trincot 17.01.2019 23:02
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Несколько различий между двумя стилями:

  • Мутация: второй способ изменяет объект во времени. Поэтому, если вы каким-то образом получили доступ к объекту до того, как завершили его определение, он мог бы выглядеть по-другому. первый способ не создает объект до тех пор, пока он не будет полностью определен. Это дает вам хорошую гарантию на уровне синтаксиса, что вы не можете так много испортить, и это основная причина, по которой я предпочитаю этот метод. Я стараюсь избегать мутаций, когда могу.

  • Сфера: в первом случае объем определений немного отличается. во втором случае областью действия является функция, в которой создается объект. В первом случае областью действия является создаваемый объект. См. Функция стрелки против объявления/выражения функции: эквивалентны ли они/заменяемы?

  • Краткость: второй путь немного длиннее первого.

  • Итерабельность и необычные свойства: в некоторых случаях первый способ позволяет создавать специальные определения свойств, которые вести себя немного иначе, чем obj.foo = bar. Вы можете использовать Object.defineProperty(), чтобы сделать то же самое.

Однако в вашем конкретном примере они идентичны (пока вы не используете this или arguments ни в одной из его функций) и просто вопрос предпочтений.

Второй семантически правильный в JavaScript, но не в TypeScript, некоторые линтеры могут запросить у вас интерфейс или что-то в этом роде, но это не проблема ошибки, а проблема стиля. В конце они оба делают одно и то же.

Хм. Что будет this в этих стрелочных функциях?

Andy 17.01.2019 23:15

@Энди, верно? Да, я не уверен, что это пришло мне в голову (почти уверен, что это объект, но я хотел бы убедиться, что я не ошибся в его памяти, а область действия на самом деле была функцией создания). Еще более запутанно, что означает arguments?

Garrett Motzner 17.01.2019 23:21

@Andy При запуске непосредственно в консоли браузера this внутри функций стрелок является объектом Window.

Herohtar 17.01.2019 23:42

Я знаю ответ :) Я проверял, знает ли Майкл. Это описано в этой ссылке в моем первом комментарии под вопросом.

Andy 17.01.2019 23:44

Прости! Я неправильно скопировал, вы правы, когда TS переводится, это относится к реальному контексту, в данном случае к окну. Я исправлю @Энди

Michael Sandoval 18.01.2019 00:55

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