Entonces, de acuerdo con los documentos de MDN :
class Rectangle { height = 0; width; constructor(height, width) { this.height = height; this.width = width; } }Al declarar los campos por adelantado, las definiciones de clase se vuelven más autodocumentadas y los campos siempre están presentes.
Como se vio anteriormente, los campos se pueden declarar con o sin un valor predeterminado.
Al principio pensé que si creaba un objeto usando el constructor anterior y no pasaba los argumentos de alto y ancho , tendría height = 0 . Sin embargo, no es un caso. Es undefined .
let rectangle = new Rectangle() console.log(rectangle.height) // this is undefinedEntonces, ahora no puedo entender el punto de las declaraciones de campo público. Parecen líneas adicionales de código sin mucho propósito. ¿Qué beneficios traen? Gracias por cualquier explicación.
La línea this.height = height; reemplaza el valor predeterminado de la declaración con el valor del parámetro de height . No importa que no se haya proporcionado ningún argumento, aún realiza la asignación. Y cuando no se proporciona el argumento, el parámetro predeterminado es undefined .
Puede verificar esto y no anular el valor predeterminado inicial:
class Rectangle { height = 0; width; constructor(height, width) { if (height !== undefined) { this.height = height; } this.width = width; } }O podría proporcionar los valores predeterminados en la lista de argumentos del constructor en lugar de las declaraciones de propiedades.
class Rectangle { height; width; constructor(height = 0, width = 0) { this.height = height; this.width = width; } }Está asignando a la height en el constructor, anulando efectivamente la asignación de campo de clase:
this.height = height;Los campos de clase asignan propiedades a la instancia antes de que se ejecute el cuerpo del constructor, en su mayor parte: su código original es casi equivalente a
class Rectangle { constructor(height, width) { this.height = 0; this.width; this.height = height; this.width = width; } } let rectangle = new Rectangle() console.log(rectangle.height)lo que debería hacer que el problema sea obvio.
Parecen líneas adicionales de código sin mucho propósito.
Sí, si asigna incondicionalmente esas propiedades en el constructor, tener dichos campos no ayuda mucho: les dirá a los lectores del código rápidamente qué propiedades de instancia existirán, pero también significa código adicional.
Los campos de clase son mucho más útiles cuando desea asignar propiedades de instancia que no se sobrescriben inmediatamente, como:
class Rectangle { height = 5; constructor(width) { this.width = width; } } let rectangle = new Rectangle(8) console.log(rectangle.height, rectangle.width)Los campos de clase son un buen azúcar de sintaxis cuando tiene varias propiedades para asignar a la instancia que no dependen de los argumentos del constructor.