Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

229
Vistas
¿Cuáles son las 'reglas' para nombres con captadores/configuraciones en una clase?

¿Cuáles son las restricciones sobre el uso de getters y setters en javascript? Por ejemplo, aquí hay algunos escenarios que he visto cuando solo hacía prueba y error:

 class User { // 1 - must have an alias somewhere or will get loop constructor(name) { this.name = name; } get name() { console.log('--- Getter ---'); return this.name; } set name(name) { console.log('--- Setter --- '); this.name = name; } } const user = new User('David'); console.log(user.name);

 class User { name; // 2 - setter/getter must have a property with exact name in constructor? constructor(name) { this._name = name; } get name() { console.log('--- Getter ---'); return this._name; } set name(name) { console.log('--- Setter --- '); this._name = name; } } const user = new User('David'); console.log(user.name); user.name = 'Keith'; console.log(user.name);

Es una comprensión correcta de un setter/getter que:

  1. El nombre debe tener un alias.
  2. El setter/getter debe tener ese nombre exacto definido en el constructor.

Finalmente, poniéndolo todo junto, ¿el siguiente parece un buen patrón para ocultar campos cuando el usuario es un getter/setter, ya que parece que #name (privado) y name (público) actúan como dos variables diferentes?

 class User { #name; constructor(name) { this.name = name; } get name() { console.log('-getter-'); return this.#name; } set name(name) { console.log('-setter-'); this.#name = name } } bob = new User('Bob'); bob.name = 'Bobby'; console.log(bob.name);

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Un campo de respaldo no es un requisito, no hace falta decir un campo de respaldo con el mismo nombre. Ni siquiera necesita setter y getter si todo lo que hace es configurar y obtener un campo de respaldo, ya que funcionalmente no habría diferencia con respecto a un campo normal.

Getter y Setter generalmente se usan cuando

  1. la propiedad es una propiedad calculada, por ejemplo, derivada de otras propiedades/estado.
  2. desea hacer un trabajo adicional al acceder al campo, por ejemplo, notificar que se cambia una propiedad

Ejemplo para el caso 1:

 class Foo { constructor(bar) { this.bar = bar; } get barSquare() { return this.bar * this.bar; } set barSquare(x) { this.bar = Math.sqrt(x); } } let foo = new Foo(4); console.log(foo.barSquare); foo.barSquare = 25; console.log(foo.bar);

Ejemplo para el caso 2:

En este caso, necesita un campo de respaldo, aunque el nombre del campo de respaldo puede ser cualquier cosa excepto el nombre del colocador/captador.

 class Foo { constructor(bar) { this._bar = bar; } get bar() { return this._bar; } set bar(x) { console.log(`bar is changed to ${x}!`); this._bar = x; } } let foo = new Foo(4); console.log(foo.bar); foo.bar = 5; console.log(foo.bar);

Finalmente, el nombre del parámetro ( bar ) definido en constructor(bar) no tiene ninguna relación. Puede ser cualquier nombre de variable legal. Está en el ámbito del bloque constructor. Por ejemplo, puede ser

 class Foo { constructor(totallyRandomName) { this.someBackingFieldName = totallyRandomName; } get bar() { return this.someBackingFieldName; } set bar(x) { console.log(`bar is changed to ${x}!`); this.someBackingFieldName = x; } } let foo = new Foo(4); console.log(foo.bar); foo.bar = 5; console.log(foo.bar);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Dando una puñalada a los comentarios de @Bergi:

[De la pregunta, suposición incorrecta de que] "El setter/getter debe tener ese nombre exacto definido en el constructor".

  1. No, un constructor no necesita asignar la propiedad en absoluto; también puede dejarlo sin inicializar.

 class Person { name; set name(y) { console.log('setName'); this.name = y; } get name() { console.log('getName'); return this.name; } } let bob = new Person(); bob.name = 'Bob' console.log(bob.name);

  1. O incluso inicialice el ._name subyacente directamente.

 class Person { constructor(x) { this.someOtherName = x; } set name(y) { console.log('setName'); this.someOtherName = y; } get name() { console.log('getName'); return this.someOtherName; } } let bob = new Person(); bob.name = 'Bob' console.log(bob.name);

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda