Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.
Enlaza la propiedad de un objeto con una función que será llamada al asignarle 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 peude 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:
- Puede tener un String o Number como identificador;
- Debería de tener exactamente un parámentro (ver Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments para más información);
- No debe haber múltiples setters para una misma propiedad.
({ set x(v) { }, set x(v) { } }
and{ x: ..., set x(v) { } }
está prohibido )
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 objecto "O" que cuando se le asigne un valor, se añadirá al log:
var o = { set current (str) { this.log[this.log.length] = str; }, log: [] }
Tenga en cuenta que "current" 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 o.current;
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) The definition of 'Object Initializer' in that specification. |
Standard | Definición inicial. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Method definitions' in that specification. |
Standard | Añadidas las propiedades computadas. |
ECMAScript 2017 Draft (ECMA-262) The definition of 'Method definitions' in that specification. |
Draft |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 1 | 2.0 (1.8.1) | 9 | 9.5 | 3 |
Computed property names | No support | 34 (34) | No support | No support | No support |
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 | No support | No support | 34.0 (34.0) | No support | No support | No support |
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
- getter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters in JavaScript Guide