blob: 9cb5c483677ee95f97dd49f23c2213cf77ef3d37 (
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
|
---
title: static
slug: Web/JavaScript/Reference/Classes/static
translation_of: Web/JavaScript/Reference/Classes/static
---
<div>{{jsSidebar("Classes")}}</div>
<p>A palavra-chave <code><strong>static</strong></code> define um método estático para uma classe.</p>
<div>{{EmbedInteractiveExample("pages/js/classes-static.html")}}</div>
<h2 id="Síntaxe">Síntaxe</h2>
<pre class="syntaxbox">static <em>nomeDoMetodo</em>() { ... }</pre>
<h2 id="Descrição">Descrição</h2>
<p>Métodos estáticos são chamados diretamente na classe mas não em instâncias da mesma. Estes são regularmente utilizados para criar funções utilitárias.</p>
<h2 id="Como_chamar_métodos_estáticos">Como chamar métodos estáticos</h2>
<h3 id="Noutro_método_estático">Noutro método estático</h3>
<p>Para chamar um método estático dentro de outro que pertença à mesma classe, pode-se usar a palavra-chave <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/this">this</a></code>.</p>
<pre class="brush: js">class StaticMethodCall {
static staticMethod() {
return 'Metodo estatico foi invocado';
}
static anotherStaticMethod() {
return this.staticMethod() + ' dentro de outro';
}
}
StaticMethodCall.staticMethod();
// 'Metodo estatico foi invocado'
StaticMethodCall.anotherStaticMethod();
// 'Metodo estatico foi invocado dentro de outro'</pre>
<h3 id="No_construtor_de_classe_e_noutros_métodos">No construtor de classe e noutros métodos</h3>
<p>Métodos estáticos não são acessíveis através da palavra-chave <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/this">this</a></code> quando dentro de métodos não-estáticos. É preciso chamá-los ou através do nome da própria classe: <code>CLASSNAME.STATIC_METHOD_NAME()</code> ou como propriedade do construtor da classe: <code>this.constructor.STATIC_METHOD_NAME()</code>.</p>
<pre class="brush: js">class StaticMethodCall {
constructor() {
console.log(StaticMethodCall.staticMethod());
// 'metodo estatico foi invocado.'
console.log(this.constructor.staticMethod());
// 'metodo estatico foi invocado.'
}
static staticMethod() {
return 'metodo estatico foi invocado.';
}
}</pre>
<h2 id="Exemplos">Exemplos</h2>
<p>Os seguintes exemplos demonstram:</p>
<ol>
<li>Como implementar um método estático numa classe.</li>
<li>Que se podem criar sub-classes a partir de uma classe com um membro estático (e usá-los).</li>
<li>Como se pode chamar um método estático (com contra-exemplos).</li>
</ol>
<pre class="brush: js">class Triple {
static triple(n) {
if (n === undefined) {
n = 1;
}
return n * 3;
}
}
class BiggerTriple extends Triple {
static triple(n) {
return super.triple(n) * super.triple(n);
}
}
console.log(Triple.triple()); // 3
console.log(Triple.triple(6)); // 18
var tp = new Triple();
console.log(BiggerTriple.triple(3));
// 81 (não foi afetado pela instanciação do pai)
console.log(tp.triple());
// 'tp.triple is not a function'. (não é função)
</pre>
<h2 id="Especificações">Especificações</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Especificação</th>
<th scope="col">Estado</th>
<th scope="col">Comentário</th>
</tr>
<tr>
<td>{{SpecName('ES2015', '#sec-class-definitions', 'Definições de Classe')}}</td>
<td>{{Spec2('ES2015')}}</td>
<td>Definição inicial.</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-class-definitions', 'Definições de Classe')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Compatibilidade_de_browsers">Compatibilidade de browsers</h2>
<p>{{Compat("javascript.classes.static")}}</p>
<h2 id="Ver_também">Ver também</h2>
<ul>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Operators/class">expressão <code>class</code></a></li>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/class">declaração <code>class</code></a></li>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Classes">Classes</a></li>
</ul>
|