Я знаю, что в этой теме было еще несколько вопросов, но ни один из них, похоже, не дает окончательного ответа.Обозначение класса JavaScript и ключевое слово «this»
Я строй HTML/CSS/JS мобильного приложения, и пытаюсь следующий стилем обозначений для определения некоторых классов:
стилизации
var Thing = (function()
{
var _instance;
var _firstName;
var _lastName;
function Thing(firstName, lastName)
{
_instance = this;
_firstName = firstName;
_lastName = lastName;
}
Thing.prototype.getMyName = function()
{
return _firstName + " " + _lastName;
}
Thing.prototype.speak = function()
{
return ("My name is " + _instance.getMyName());
}
return Thing;
}());
Преимущество этого являются:
- Переменные участника инкапсулированы и могут быть указаны непосредственно (например, без префикса
this
). - Я могу использовать переменную
_instance
и поэтому избегать двусмысленности вокруг идентификатораthis
. - Обозначения достаточно чисты и удобочитаемы.
Я также дал следующие альтернативы попробовать:
Стиль B
function Thing(firstName, lastName)
{
this._firstName = firstName;
this._lastName = lastName;
}
Thing.prototype.getMyName = function()
{
return this._firstName + " " + this._lastName;
};
Thing.prototype.speak = function()
{
return "My name is " + this.getMyName();
};
Стиль C
class Thing
{
constructor (firstName, lastName)
{
this._firstName = firstName;
this._lastName = lastName;
}
getMyName()
{
return this._firstName + " " + this._lastName;
}
speak()
{
return ("My name is " + this.getMyName());
}
}
Но, несмотря на свои преимущества, я нашел B и C сложно работать из-за проблем, связанных с ключевым словом this
; то есть в зависимости от контекста вызывающего абонента this
может ссылаться на разные вещи в методах класса. Кроме того, в обоих случаях использование переменной _instance
, как у меня есть, в A невозможно, так как всем участникам необходимо префикс this.
.
Однако, как указано в комментариях, Стиль A не работает при создании нескольких экземпляров класса.
Каков наилучший способ написать такие классы, но избежать проблем с this
?
Ваш «Стиль А» просто не работает. Вы пытались создать несколько экземпляров? Также вы никогда не инициализируете '_instance'. – Bergi
Стиль А отличается от остальных. Эти переменные в закрытии повторно используются для каждого экземпляра. – elclanrs
Спасибо @Bergi, я отредактировал для инициализации '_instance'. – Benp44