Il costrutto sintattico set
collega una proprietĂ di un oggetto ad una funzione che viene chiamata quando si ha un tentativo di modifica di quella proprietĂ .
Sintassi
{set prop(val) { . . . }} {set [expression](val) { . . . }}
Parametri
prop
- Il nome della proprietĂ da collegare alla funzione data.
val
- Un alias per la variabile che contiene il valore che si sta cercando di assegnare a
prop
. - expression
- A partire da ECMAScript 6, è possibile anche usare espressioni per nomi di proprietà computate da collegare alla funzione data.
Descrizione
In JavaScript, un setter può essere utilizzato per eseguire una funzione ogniqualvolta una proprietà specificata sta per essere modificata. I setters sono quasi sempre utilizzati insieme ai getters per creare un tipo di pseudo proprietà . Non è possibile avere un setter su una normale proprietà che contiene un valore.
Alcune note da considerare quando si utilizza il costrutto sintattico set
:
- Può avere un identificatore che può essere od un numero od una stringa;
- Deve avere esattamente un parametro(consultare Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments per maggiori informazioni);
- Non può apparire in un letterale di un oggetto con un altro set o con un assegnamento per la stessa proprietà .
({ set x(v) { }, set x(v) { } }
e{ x: ..., set x(v) { } }
non sono permessi )
Un setter può essere eliminato usando l'operatore delete
.
Esempi
Definire un setter per nuovi oggetti in inizializzatori di oggetti
Questo snippet di codice definisce una pseudo proprietĂ current
di un oggetto o
che, una volta che vi si assegna un valore, aggiornerĂ log
con quel valore:
var o = {
set current (str) {
this.log[this.log.length] = str;
},
log: []
}
Nota che current
non è definito ed ogni tentativo di accedervi risulterà in un undefined
.
Rimuovere un setter con l'operatore delete
Se vuoi rimuovere il setter usato sopra, puoi semplicemente usare delete
:
delete o.current;
Definire un setter su oggetti pre-esistenti usando defineProperty
Per aggiungere un setter ad un oggetto pre-esistente, usaObject.defineProperty()
.
var o = { a:0 };
Object.defineProperty(o, "b", { set: function (x) { this.a = x / 2; } });
o.b = 10; // Runs the setter, which assigns 10 / 2 (5) to the 'a' property
console.log(o.a) // 5
Usare il nome di una proprietĂ computata
Nota: Le proprietĂ computate sono una tecnologia sperimentale, parte dello standard proposto ECMAScript 6, e non sono ancora sufficientemente supportate dai browsers. L'uso di queste proprietĂ in ambienti che non le supportano produrrĂ un errore di sintassi.
var expr = "foo";
var obj = {
baz: "bar",
set [expr](v) { this.baz = v; }
};
console.log(obj.baz); // "bar"
obj.foo = "baz"; // run the setter
console.log(obj.baz); // "baz"
Specifiche
Specifica | Status | Commento |
---|---|---|
ECMAScript 5.1 (ECMA-262) The definition of 'Object Initializer' in that specification. |
Standard | Definizione iniziale. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Method definitions' in that specification. |
Standard | Aggiunti i nomi di proprietĂ computate. |
ECMAScript (ECMA-262) The definition of 'Method definitions' in that specification. |
Living Standard |
CompatibilitĂ dei browsers
Caratteristica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Supporto base | 1 | 2.0 (1.8.1) | 9 | 9.5 | 3 |
Nomi di proprietĂ computate | No support | 34 (34) | No support | No support | No support |
Caratteristica | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Supporto base | (Yes) | (Yes) | 1.0 (1.8.1) | (Yes) | (Yes) | (Yes) |
Nomi di proprietĂ computate | No support | No support | 34.0 (34.0) | No support | No support | No support |
Note specifiche per SpiderMonkey
- A partire da JavaScript 1.8.1, i setters non sono piĂš chiamati durante il setting delle properietĂ negli inizializzatori di oggetti od array.
- A partire da SpiderMonkey 38, un setter con rest parameter produce un
SyntaxError
come da specifica ES6.
Guarda anche
- getter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters nella guida JavaScript