Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

La sintaxis  set  enlaza  la propiedad de un objeto con una función que será llamada cada vez que se le asigne un valor.

Sintaxis

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

Parámetros

prop
El nombre de la propiedad a unir con la función dada.
val
Variable que contiene el nuevo valor a asignar a la propiedad.
expression
En ECMAScript 6, se puede usar expresiones para propiedades computadas.

Descripción

En JavaScript, un setter puede ser usado para ejecutar una función para una propiedad especifica que será ejecutada al cambiar el valor. Los setters se suelen usar con getters para crear un tipo de pseudo-propiedad. No es posible tener un setter para una propiedad que tiene un valor real.

Tenga en cuenta lo siguiente al trabajar con setters:

Un setter puede ser eliminado usando el operador delete.

Ejemplos

Definiendo un setter en un nuevo objecto en la inialización

Definimos una pseudo-propiedad  current al objeto historial que cuando se le asigne un valor, se añadirá al log:

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

historial.actual='mensaje 2';
console.log(historial.log)//['mensaje 1', 'mensaje 2']

 

Tenga en cuenta que actual no está definido y cualquier intento de acceder devolverá undefined.

Eliminando setters con el operador delete 

Podemos utilizar el operador delete para eliminar un setter:

delete historial.actual;

Definiendo un setter en un objecto existente usando defineProperty

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

var o = { a:0 };

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

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

Usando una propiedad computada

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.

var expr = "foo";

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

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

Specifications

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 Añadidas las propiedades computadas.
ECMAScript Latest Draft (ECMA-262)
La definición de 'Method definitions' en esta especificación.
Draft  

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

SpiderMonkey-specific notes

  • Starting with JavaScript 1.8.1, setters are no longer called when setting properties in object and array initializers.
  • From SpiderMonkey 38 on, a setter with a rest parameter is a SyntaxError as per the ES6 specification.

See also

Etiquetas y colaboradores del documento

 Colaboradores en esta página: alannungaray, DavidBernal
 Última actualización por: alannungaray,