Questa traduzione è incompleta. Collabora alla traduzione di questo articolo dall’originale in lingua inglese.
Il costrutto sintattico set
collega una proprietà di un oggetto ad una funzione che viene chiamata quando si ha un tentavo di modifica 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 2017 Draft (ECMA-262) The definition of 'Method definitions' in that specification. |
Draft |
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