В настоящее время я знаю, как создавать классы и объекты.
Метод 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();
В чем разница между тремя, а какая из них наиболее эффективна/практична? Особенно с первым методом?
Методы 1 не являются классом или объектом, а скорее модулем - этот метод позволяет инкапсулировать некоторый код внутри функции, которая немедленно выполняется в текущей среде выполнения. Поскольку вы передаете this
в то время, когда вы его вызываете, какова бы ни была ваша текущая область видимости (и это может быть вызвано из декларации класса, например, как своего рода mixin.
Метод 2 снова доступен в ES6, как указано в вашем вопросе. Некоторые разработчики нахмурились от этого из-за путаницы, которую он вызывает. См. Здесь: https://medium.com/@rajaraodv/is-class-in-es6-the-new-bad-part-6c4e6fe1ee65. Основным преимуществом этого является то, что он дает нам какой-то синтаксический сахар, а недостатком является то, что он кажется похожим на то, что на самом деле у JavaScript есть классы, чего нет (и снова, как упоминалось в вашем вопросе, он полагается на прототипирование для наследования),
Метод 3 - это "классический" способ создания объекта. Опираясь на то, что JavaScript-области, закрытие и контекст работают, мы получаем функцию, которая может быть вызвана, как если бы она была конструктором класса, и это действительно неплохо подходит для аппроксимации этого. Лично это по-прежнему мой предпочтительный метод - нет никакой реальной разницы в эффективности среди перечисленных трех методов, но этот метод является самым старым и, следовательно, самым распространенным и читаемым. По этой причине он получает мой голос.