Я сейчас читаю машинописный текст. Он конвертирует современный ES21 в более старые версии. Мне интересно, почему именно так, я имею в виду, почему разработчики создавали целую переменную _this
и устанавливали ее в ключевое слово this
. Как будто проще просто поставить this
вместо того, чтобы создавать новую переменную ... Есть идеи?
Ввод (TypeScript)
const Singleton = () => {
if (Singleton._instance) return Singleton._instance;
Singleton._instance = this;
return this;
};
const a = new Singleton();
const b = new Singleton();
console.log(a === b);
Вывод (JavaScript)
// BUT WHY ?
var _this = this;
var Singleton = function () {
if (Singleton._instance)
return Singleton._instance;
Singleton._instance = _this;
return _this;
};
var a = new Singleton();
var b = new Singleton();
console.log(a === b);
this
, его значение не статично, а определяется при вызове время. Если вы хотите использовать правильныйthis
, вам нужно чтобы захватить это. - person VLAZ   schedule 11.03.2021const Singleton = () => {
Не будетthis
, он будет таким же, какglobalThis
илиwindow
в старых деньгах .. Он действительно должен бытьconst Singleton = function () {
, чтобы он был действительным. IOW:console.log(a === b);
Эквивалентwindow === window
, и, конечно же, это так. - person Keith   schedule 11.03.2021this
, а в том, что он его даже не получает .. `() =› {} `` ,, нетthis
- person Keith   schedule 11.03.2021_this
существует, где код является скорее иллюстрацией. - person VLAZ   schedule 11.03.2021this
. Прекрасная работа! - person user15328189   schedule 11.03.2021readonly
, хотя должно быть на самом делеprivate
, 2. Говоря о свойствах, это должен быть класс, а не функция. 3. С появлением модулей шаблон singleton в значительной степени устарел. Просто используйтеexport const instance = new Singleton();
, и вам действительно не нужно когда-либо вызыватьnew
. Весь импорт будет таким же. 4. Даже без модулей или классов это мог бы быть IIFE, который создает и хранит экземпляр. - person VLAZ   schedule 11.03.2021#
я не использую сейчас, но, возможно ... А что насчет того, чтобы я просто создал свойство только для чтения, как вы сказали, используяObject.createProperty()
? - person user15328189   schedule 11.03.2021JS doesn't support private stuff
Есть много способов делать частные вещи в JS. Возьмите это - ›var x = (function () { var private = 'hello'; return () => console.log(private); })()
Здесь нет доступа кprivate
, еще один вариант для приватного в современном JS - это такжеWeakMap
- person Keith   schedule 11.03.2021