O que o símbolo `#` faz em JavaScript?

Nov 23 2020

Encontrei o código que continha o #sinal. Para que isso é usado? O código é parecido com este:

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

Respostas

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

É um sigilo (ao invés de um operador) que indica que o membro é privado - neste caso, um método privado , mas também é usado para campos privados .

Você não pode usar um método privado ou campo privado no código fora da classe que os declara. Por exemplo:

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

Esta é uma proposta experimental. Você pode definir métodos JavaScript privados usando#

Para obter mais informações, você pode consultar os documentos MDN

As propriedades da classe são públicas por padrão e podem ser examinadas ou modificadas fora da classe. No entanto, existe uma proposta experimental para permitir a definição de campos de classe privada usando um #prefixo hash .


Você pode conseguir algo semelhante usando ES5 (apenas por uma questão de simplicidade para explicar), onde você pode simular algo como métodos privados (que o JavaScript não tem nativamente).

Por exemplo:

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
  }
}

Acima, ele apenas exporá o initmétodo do someObjqual pode ser chamado como someObj.init(), enquanto o seu someMethodnão estará acessível fora de seu método pai.

Exemplo:

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

hash é usado para definir campos de classe privada