JavaScript agregó recientemente campos de clase privada, nombrados con un prefijo hash.
( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields )
Estoy buscando una respuesta clara sobre si esta forma de privacidad es "por clase" o "por instancia".
Digamos que una clase de Persona se define con un campo privado llamado '#secreto'.
Uso 'nuevo' para construir dos instancias de la clase Person: person1 y person2.
¿Persona1 tiene acceso para inspeccionar y modificar el campo #secreto de persona2?
class Person { #secret; constructor(secret) { this.#secret = secret; } getSomebodyElsesSecret(somebody) { return somebody.#secret; } setSomebodyElsesSecret(somebody, value) { somebody.#secret = value; } }Son por clase: una instancia puede ver y modificar otra instancia.
class Person { #secret; constructor(secret) { this.#secret = secret; } getSomebodyElsesSecret(somebody) { return somebody.#secret; } setSomebodyElsesSecret(somebody, value) { somebody.#secret = value; } } const a = new Person('a'); const b = new Person('b'); console.log(a.getSomebodyElsesSecret(b)) a.setSomebodyElsesSecret(b, 'c'); console.log(a.getSomebodyElsesSecret(b)) Una forma de verlo es que los campos privados son similares a las variables con alcance solo para la clase : se puede hacer referencia a ellos como se quiera por cualquier cosa dentro de {} de la clase, y no se puede hacer referencia fuera.
En términos de alcance, es un poco como un WeakMap que define las variables privadas y un IIFE que devuelve la clase:
const Person = (() => { const secrets = new WeakMap(); return class Person { constructor(secret) { secrets.set(this, secret); } getSomebodyElsesSecret(somebody) { return secrets.get(somebody); } setSomebodyElsesSecret(somebody, value) { secrets.set(somebody, value); } } })(); const a = new Person('a'); const b = new Person('b'); console.log(a.getSomebodyElsesSecret(b)) a.setSomebodyElsesSecret(b, 'c'); console.log(a.getSomebodyElsesSecret(b))No. Si era público, puede acceder a él como person2.secret pero ahora es privado, lo que significa que no puede acceder directamente fuera de la clase.