setter

Traducción en progreso.

La sintaxis  set  asocia la propiedad de un objeto a una función que será llamada cuando haya un intento de asignar valor a esa propiedad.

Sintaxis

{set prop(val) { . . . }}
{set [expression](val) { . . . }}

Parámetros

prop
El nombre de la propiedad a asociar con la función dada.
val
Un alias para la variable que contiene el valor a asignar a la propiedad.
expression
A partir de ECMAScript 2015, se puede también usar expresiones para nombres de propiedades computados para asociar a la función dada.

Descripción

En JavaScript, un setter puede ser usado para ejecutar una función donde sea que una propiedad se intente cambiar. Los setters son regularmente usados en conjunto con getters para crear un tipo de pseudo-propiedad. No es posible tener simultáneamente un setter en una propiedad que ya tiene un valor.

Tenga en cuenta lo siguiente al trabajar con setters:

Ejemplos

Definiendo un setter en el inicializador de nuevos objetos

En el siguiente ejemplo definimos una pseudo-propiedad  actual  al objeto lenguaje. Cuando se le asigne un valor a actual, actualiza log con ese valor:

var lenguaje = {
  set actual(mensaje) {
    this.log.push(mensaje);
  },
  log: []
}
lenguaje.actual='ES';
console.log(lenguaje.log); // ['ES']

lenguaje.actual='FR';
console.log(lenguaje.log); // ['ES', 'FR']

Note que actual no está definido y cualquier intento de accederlo devolverá undefined.

Eliminando un setter con el operador delete 

Si desea eliminar el setter, puede simplemente aplicar delete en él:

delete lenguaje.actual;

Definiendo un setter en un objecto existente usando defineProperty

Para añadir un setter a un objeto existente, use Object.defineProperty()

consr o = {a: 0};

Object.defineProperty(o, 'b', {
  set: function (x) { this.a = x / 2; }
});

o.b = 10; // Ejecuta el setter, el cual asigna 10 / 2 (5) a la propiedad 'a'
console.log(o.a) // 5

Usando un nombre de propiedad computado

Nota: Propiedades computadas son 'experimental technology', parte de la propuesta para ECMAScript 6, y no está soportado en todos los navegadores. Dará error de sintaxis en entornos no soportados.

const expr = 'foo';

var obj = {
  baz: 'bar',
  set [expr](v) { this.baz = v; }
};

console.log(obj.baz); // "bar"
obj.foo = "baz";      // ejecuta el setter
console.log(obj.baz); // "baz"

Especificaciones

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
La definición de 'Object Initializer' en esta especificación.
Standard Definición inicial.
ECMAScript 2015 (6th Edition, ECMA-262)
La definición de 'Method definitions' en esta especificación.
Standard Se añaden las propiedades computadas.
ECMAScript (ECMA-262)
La definición de 'Method definitions' en esta especificación.
Living Standard

Compatibilidad con navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 1 2.0 (1.8.1) 9 9.5 3
Computed property names Sin soporte 34 (34) Sin soporte Sin soporte Sin soporte
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) 1.0 (1.8.1) (Yes) (Yes) (Yes)
Computed property names Sin soporte Sin soporte 34.0 (34.0) Sin soporte Sin soporte Sin soporte

Notas específicas para SpiderMonkey-specific

  • Comenzando con JavaScript 1.8.1, los setters ya no son llamados cuando se definen las propiedades en los inicializadores de objetos y arrays.
  • De SpiderMonkey 38 en adelante, un setter con un rest parameter es un SyntaxError conforme a la especificación ES6.

Ver también