aboutsummaryrefslogtreecommitdiff
path: root/files/it/web/javascript/reference/functions/get/index.html
blob: 439255284c258cd3a60c92d2e0e65f5bd9702b8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
---
title: getter
slug: Web/JavaScript/Reference/Functions/get
translation_of: Web/JavaScript/Reference/Functions/get
original_slug: Web/JavaScript/Reference/Functions_and_function_scope/get
---
<div>{{jsSidebar("Functions")}}</div>

<p>La sintassi <strong><code>get</code></strong>  associa una proprietà dell'oggetto a una funzione che verrà chiamata quando la proprietà verrà richiesta.</p>

<div>{{EmbedInteractiveExample("pages/js/functions-getter.html")}}</div>

<p class="hidden">La fonte per questo esempio interattivo è memorizzata in un repository GitHub. Se desideri contribuire ai progetti interattivi di esempio, puoi clonare https://github.com/mdn/interactive-examples e inviarci una richiesta di pull.</p>

<h2 id="Sintassi">Sintassi</h2>

<pre class="syntaxbox">{get <em>prop</em>() { ... } }
{get <em>[expression]</em>() { ... } }</pre>

<h3 id="Parametri">Parametri</h3>

<dl>
 <dt><code>prop</code></dt>
 <dd>Il nome della proprietà da associare alla funzione specificata.</dd>
 <dt>espressione</dt>
 <dd>A partire da ECMAScript 2015, è anche possibile utilizzare espressioni per un nome di proprietà calcolato per associarsi alla funzione specificata.</dd>
</dl>

<h2 id="Descrizione">Descrizione</h2>

<p>A volte è preferibile consentire l'accesso a una proprietà che restituisce un valore calcolato in modo dinamico, oppure è possibile che si desideri riflettere lo stato di una variabile interna senza richiedere l'uso di chiamate esplicite al metodo. In JavaScript, questo può essere realizzato con l'uso di un <em>getter</em>. Non è possibile avere simultaneamente un getter legato a una proprietà e avere quella proprietà contenuta in un valore, anche se è possibile usare un getter e un setter insieme per creare un tipo di pseudo-proprietà.</p>

<p>Tieni presente quanto segue quando lavori con la sintassi <code>get</code>:</p>

<div>
<ul>
 <li>Può avere un identificatore che è un numero o una stringa;</li>
 <li>Deve avere esattamente zero parametri (vedi <a href="http://whereswalden.com/2010/08/22/incompatible-es5-change-literal-getter-and-setter-functions-must-now-have-exactly-zero-or-one-arguments/">Modifica ES5 non compatibile: le funzioni getter e setter letterali devono ora avere esattamente zero o un argomento</a> per maggiori informazioni);</li>
 <li>Non deve apparire in un oggetto letterale con un altro <code>get</code> o con un inserimento dati per la stessa proprietà (<code>{ get x() { }, get x() { } }</code> e <code>{ x: ..., get x() { } }</code> sono vietati).</li>
</ul>
</div>

<p>Un getter può essere rimosso usando l'operatore  <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/delete" title="en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/delete_Operator">delete</a></code></p>

<h2 id="Esempi">Esempi</h2>

<h3 id="Definizione_di_un_getter_sui_nuovi_oggetti_negli_inizializzatori_di_oggetti">Definizione di un getter sui nuovi oggetti negli inizializzatori di oggetti</h3>

<p>Questo creerà una pseudo-proprietà <code>latest</code> più recente per object <code>obj</code>, che restituirà l'ultimo elemento dell'array in <code>log</code>.</p>

<pre class="brush: js">var obj = {
  log: ['example','test'],
  get latest() {
    if (this.log.length == 0) return undefined;
    return this.log[this.log.length - 1];
  }
}
console.log(obj.latest); // "test".
</pre>

<p>Si noti che il tentativo di assegnare un valore a <code>latest</code> non lo cambierà.</p>

<h3 id="Cancellare_un_getter_usando_l'operatore_delete">Cancellare un getter usando l'operatore <code>delete</code></h3>

<p>Se vuoi rimuovere il getter, puoi semplicemente usare <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/delete">delete</a></code> :</p>

<pre class="brush: js">delete obj.latest;
</pre>

<h3 id="Definire_un_getter_su_un_oggetto_esistente_usando_defineProperty">Definire un getter su un oggetto esistente usando <code>defineProperty</code></h3>

<p>Per aggiungere un getter a un oggetto esistente in un secondo momento, usa {{jsxref("Object.defineProperty()")}}.</p>

<pre class="brush: js">var o = {a: 0};

Object.defineProperty(o, 'b', { get: function() { return this.a + 1; } });

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)</pre>

<h3 id="Utilizzando_un_nome_di_proprietà_calcolato">Utilizzando un nome di proprietà calcolato</h3>

<pre class="brush: js">var expr = 'foo';

var obj = {
  get [expr]() { return 'bar'; }
};

console.log(obj.foo); // "bar"</pre>

<h3 id="Smart_self-overwriting_lazy_getters">Smart / self-overwriting / lazy getters</h3>

<p>I getter ti danno un modo per definire una proprietà di un oggetto, ma non calcolano il valore della proprietà finché non avviene l'accesso. Un getter rinvia il costo del calcolo del valore fino a quando il valore è necessario e, se non è mai necessario, non si paga mai il costo.</p>

<p>Un'ulteriore tecnica di ottimizzazione per lazificare o ritardare il calcolo di un valore di una proprietà e memorizzarla nella cache per un accesso successivo sono <strong>smart o <a href="https://en.wikipedia.org/wiki/Memoization">memoized</a> getters</strong>. Il valore viene calcolato la prima volta che viene chiamato il getter e viene quindi memorizzato nella cache in modo che gli accessi successivi restituiscano il valore memorizzato nella cache senza ricalcolarlo. Questo è utile nelle seguenti situazioni:</p>

<ul>
 <li>Se il calcolo di un valore di una proprietà è costoso (richiede molta RAM o tempo di CPU, genera thread di lavoro, recupera file remoto, ecc.).</li>
 <li>Se il valore non è necessario solo ora. Sarà usato più tardi, o in alcuni casi non è usato affatto.</li>
 <li>Se viene utilizzato, sarà accessibile più volte e non è necessario ricalcolare il valore che non verrà mai modificato o non dovrebbe essere ricalcolato.</li>
</ul>

<p>Ciò significa che non si dovrebbe usare un getter pigro per una proprietà il cui valore si prevede possa cambiare, poiché il getter non ricalcola il valore.</p>

<p>Nell'esempio seguente, l'oggetto ha un getter come proprietà propria. Quando si ottiene la proprietà, la proprietà viene rimossa dall'oggetto e riaggiunta, ma questa volta implicitamente come proprietà dei dati. Alla fine il valore viene restituito.</p>

<pre class="brush: js">get notifier() {
  delete this.notifier;
  return this.notifier = document.getElementById('bookmarked-notification-anchor');
},</pre>

<p>Per il codice di Firefox, vedere anche il modulo del codice XPCOMUtils.jsm, che definisce la funzione <code><a href="/en-US/docs/Mozilla/JavaScript_code_modules/XPCOMUtils.jsm#defineLazyGetter()">defineLazyGetter()</a></code>.</p>

<h2 id="Specificazioni">Specificazioni</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-11.1.5', 'Object Initializer')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td>Definizione iniziale.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES2015', '#sec-method-definitions', 'Method definitions')}}</td>
   <td>{{Spec2('ES2015')}}</td>
   <td>Aggiunti nomi di proprietà calcolate.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td> </td>
  </tr>
 </tbody>
</table>

<h2 id="Compatibilità_con_il_browser">Compatibilità con il browser</h2>



<p>{{Compat("javascript.functions.get")}}</p>

<h2 id="Guarda_anche">Guarda anche</h2>

<ul>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Functions/set">setter</a></li>
 <li>{{jsxref("Operators/delete", "delete")}}</li>
 <li>{{jsxref("Object.defineProperty()")}}</li>
 <li>{{jsxref("Object.defineGetter", "__defineGetter__")}}</li>
 <li>{{jsxref("Object.defineSetter", "__defineSetter__")}}</li>
 <li><a href="/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters">Defining Getters and Setters</a> in JavaScript Guide</li>
</ul>