Что символ `#` делает в JavaScript?

Nov 23 2020

Я обнаружил код, содержащий #знак. Для чего его используют? Код выглядит примерно так:

class someObject{
  #someMethod(){
    //do something 
  }
}

Ответы

5 T.J.Crowder Nov 23 2020 at 20:05

Это сигил (а не оператор), который указывает, что член является частным - в данном случае это частный метод , но он также используется для частных полей .

Вы не можете использовать частный метод или частное поле в коде вне класса, объявляющего их. Например:

class Example {
    doSomething() {
        this.#method("from doSomething"); // <== Works
    }
    #method(str) {
        console.log("method called: " + str);
    }
}
const e = new Example();
e.doSomething();
e.#method(); // <=== FAILS
3 Mr.Alien Nov 23 2020 at 20:05

Это экспериментальное предложение. Вы можете определить частные методы JavaScript, используя#

Для получения дополнительной информации вы можете обратиться к документации MDN.

Свойства класса по умолчанию являются общедоступными и могут быть проверены или изменены вне класса. Однако существует экспериментальное предложение, позволяющее определять поля частных классов с помощью хеш- #префикса.


Вы можете добиться чего-то подобного с помощью ES5 (просто для простоты объяснения), где вы можете моделировать что-то вроде частных методов (у которых в JavaScript нет их изначально).

Например:

function someObj() { //assuming this is a class definition
  function someMethod() { //private method which is not accessible outside someObj

  }

  function init() { //initializes some methods or code, private methods can be used here
    someMethod();
  }

  return {
    init //only exposes the init method outside
  }
}

В приведенном выше примере он будет отображать только initметод из, someObjкоторый можно вызвать как someObj.init(), тогда как ваш someMethodбудет недоступен вне его родительского метода.

Пример:

someObj.init(); //works
someObj.someMethod(); //won't be accessible
1 Jondi Nov 23 2020 at 20:08

хэш используется для определения полей частного класса