He estado aprendiendo cómo funcionan las clases "bajo el capó" al implementarlas usando es5. Dado que las clases de javascript son solo "azúcar sintáctico". Recuerdo haber leído que las clases simplemente se convierten en funciones regulares de es5. Por ejemplo
class Dog { constructor(name) { this.name = name } speak(text){ console.log(text) } } const mydog = new Dog("bruno") mydog.speak("I do be liking my bones thicc")se convierte en algo como esto (pero usando la palabra clave "esto", por supuesto)
function Dog(name) { const dog = Object.create(Dog) dog.name = name Dog.prototype.speak = function (text) { console.log(text) } return dog } const mydog = Dog("bruno") mydog.speak("I know I could have refactored to used the 'new' keyword instead")Aquí está el problema, parece que no puedo implementar campos privados. ¿No debería ser esto posible si las clases son solo "azúcar sintáctica y JavaScript sigue estando basado en prototipos?
Por ejemplo, tratando de convertir la siguiente clase
class ClassWithPrivateField { #privateField; constructor() { this.#privateField = 42; delete this.#privateField; // Syntax error this.#undeclaredField = 444; // Syntax error } } const instance = new ClassWithPrivateField() instance.#privateField === 42;en una función de constructor es5 de la siguiente manera no funciona. da el error,
"#privateField' debe declararse en una clase adjunta"
function ClassWithPrivateField (){ #privateField; this.#privateField = 42; delete this.#privateField; // Syntax error this.#undeclaredField = 444; // Syntax error } const instance = new ClassWithPrivateField() instance.#privateField === 42;