В чем разница между (function (global) {} (this), функциями конструктора и классами в Javascript?

1

В настоящее время я знаю, как создавать классы и объекты.

Метод 1 (Эта страшная вещь):

;(function(global) {
  let module = global.player1 = {};
  module.x = 0;
  module.y = 0;
  module.tick = function() { /* Do stuff */ }
  module.show = function(g) {
    g.fillRect(module.x, module.y, 16, 16);
  }
})(this);

Метод 2 (классы ES6):

class CPlayer {
  constructor() {
    this.x = 16;
    this.y = 0;
  }
}
CPlayer.prototype.tick = function() { /* Do stuff */ }
CPlayer.prototype.show = function(g) {
    g.fillRect(this.x, this.y, 16, 16);  
}
let player2 = new CPlayer();

Способ 3 (функция конструктора):

function FPlayer() {
  this.x = 32;
  this.y = 0;
}
FPlayer.prototype.tick = function() { /* Do stuff */ }
FPlayer.prototype.show = function(g) {
  g.fillRect(this.x, this.y, 16, 16);  
}
let player3 = new FPlayer();

В чем разница между тремя, а какая из них наиболее эффективна/практична? Особенно с первым методом?

  • 0
    Первый - это не создание класса, это создание модуля .
  • 0
    Этот вопрос слишком широкий и очень мнительный, что делает его неподходящим для StackOverflow. Хотя, возможно, это был бы хороший вопрос для обмена стеками Code Review. Если у вас есть очень конкретные вопросы, это хорошо для SO.
Теги:
oop

1 ответ

2
Лучший ответ

Методы 1 не являются классом или объектом, а скорее модулем - этот метод позволяет инкапсулировать некоторый код внутри функции, которая немедленно выполняется в текущей среде выполнения. Поскольку вы передаете this в то время, когда вы его вызываете, какова бы ни была ваша текущая область видимости (и это может быть вызвано из декларации класса, например, как своего рода mixin.

Метод 2 снова доступен в ES6, как указано в вашем вопросе. Некоторые разработчики нахмурились от этого из-за путаницы, которую он вызывает. См. Здесь: https://medium.com/@rajaraodv/is-class-in-es6-the-new-bad-part-6c4e6fe1ee65. Основным преимуществом этого является то, что он дает нам какой-то синтаксический сахар, а недостатком является то, что он кажется похожим на то, что на самом деле у JavaScript есть классы, чего нет (и снова, как упоминалось в вашем вопросе, он полагается на прототипирование для наследования),

Метод 3 - это "классический" способ создания объекта. Опираясь на то, что JavaScript-области, закрытие и контекст работают, мы получаем функцию, которая может быть вызвана, как если бы она была конструктором класса, и это действительно неплохо подходит для аппроксимации этого. Лично это по-прежнему мой предпочтительный метод - нет никакой реальной разницы в эффективности среди перечисленных трех методов, но этот метод является самым старым и, следовательно, самым распространенным и читаемым. По этой причине он получает мой голос.

  • 0
    Какая польза от модулей тогда?
  • 0
    Модули полезны несколькими способами: они создают «частную» область видимости для определенных переменных и предоставляют только API, обеспечивающий их правильную обработку, и мы также защищены от возможных конфликтов имен. Модули и классы тесно связаны, но вы должны отдавать предпочтение классам в том случае, когда вам нужен фактический объект для представления чего-либо (особенно если вам нужно более одного). Модуль был бы более полезен в случае, когда вы предоставляете набор функций и хотите скрыть некоторые реализации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню