blob: a58cb3288feb61f4abd45f9ba1cfd5898e61f814 (
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
|
---
title: プロパティアクセサー
slug: Web/JavaScript/Reference/Operators/Property_Accessors
tags:
- JavaScript
- Language feature
- Operator
- Reference
translation_of: Web/JavaScript/Reference/Operators/Property_Accessors
---
<div>{{jsSidebar("Operators")}}</div>
<p><span class="seoSummary"><strong>プロパティアクセサー</strong>はオブジェクトのプロパティへのアクセスを提供するもので、ドット表記法またはブラケット表記法を使用します。</span></p>
<div>{{EmbedInteractiveExample("pages/js/expressions-propertyaccessors.html", "taller")}}
</div>
<h2 id="Syntax" name="Syntax">構文</h2>
<pre class="brush: js"><var>object</var>.<var>property</var>
<var>object</var>['<var>property</var>']
</pre>
<h2 id="Description">解説</h2>
<p>オブジェクトは実際には<em>連想配列</em> (別名 <em>map</em>、 <em>dictionary</em>、 <em>hash</em>、 <em>lookup table</em>) とみなすことができます。この配列における<em>キー</em>はオブジェクトのプロパティ名です。</p>
<p>一般的に、オブジェクトのプロパティについて説明する際には、プロパティとメソッドを区別します。しかし、プロパティとメソッドの区別は慣習的なものにすぎません。メソッドは呼び出すことができるプロパティです (例えば、値として {{jsxref("Function")}} インスタンスへの参照を持っているようなものです)。</p>
<p>プロパティにアクセスするには、<em>ドット表記法</em>と<em>ブラケット表記法</em>の 2 通りがあります。</p>
<h3 id="Dot_notation">ドット表記法</h3>
<p><code><var>object.property</var></code> の構文では、 <code>property</code> は有効な JavaScript の <a href="/ja/docs/Glossary/Identifier">識別子</a>でなければなりません。 (ECMAScript 標準では、プロパティの名前は技術的には "IdentifierNames" であり、 "Identifiers" ではないので、予約語を使用することができますがお勧めしません)。例えば、 <code><var>object</var>.$1</code> は有効であるのに対し、 <code><var>object</var>.1</code> は有効ではありません。</p>
<pre class="brush: js">const variable = <var>object</var>.<var>property_name;</var>
<var>object</var>.<var>property_name</var> = value;
</pre>
<pre class="brush: js">const object = {};
object.$1 = 'foo';
console.log(object.$1); // 'foo'
object.1 = 'bar'; // SyntaxError
console.log(object.1); // SyntaxError
</pre>
<p>ここで、 <code>createElement</code> というメソッドを <code>document</code> から取得し、呼び出します。</p>
<pre class="brush: js">document.createElement('pre')
</pre>
<p>数値リテラルに対してメソッドを使用する場合で、その数値リテラルに指数や小数点がない場合、メソッド呼び出しをするドットの前に<a href="/ja/docs/Glossary/Whitespace">ホワイトスペース</a>を入れることで、ドットが小数点とみなされることを防ぐことができます。</p>
<pre class="brush: js">77 .toExponential();
// or
77
.toExponential()
// or
;(77).toExponential()
// or
77..toExponential()
// or
77.0.toExponential()
// because 77. === 77.0, no ambiguity</pre>
<h3 id="Bracket_notation">ブラケット表記法</h3>
<p><code>object[property_name]</code> の構文では、 <code><var>property_name</var></code> は文字列または<a href="/ja/docs/Glossary/Symbol">シンボル</a>です。ですから、これは任意の文字列、例えば <code>'1foo'</code>、<code>'!bar!'</code>、または <code>' '</code> (空白) であっても構いません。</p>
<pre class="brush: js">const variable = <var>object</var>[<var>property_name</var>]
<var>object</var>[<var>property_name</var>] = value;</pre>
<p>これは前の例とまったく同じです。</p>
<pre class="brush: js">document['createElement']('pre')
</pre>
<p>ブラケット表記法の前には空白を入れることができます。</p>
<pre class="brush: js">document ['createElement']('pre')</pre>
<h3 id="Property_names">プロパティ名</h3>
<p>プロパティ名は文字列または<a href="/ja/docs/Glossary/Symbol">シンボル</a>です。それ以外の値は、数値を含めて、文字列へ強制変換されます。これは <code>'value'</code> を出力します。 <code>1</code> が <code>'1'</code> に強制変換されるからです。</p>
<pre class="brush: js">let object = {}
object['1'] = 'value'
console.log(object[1])
</pre>
<p>こちらも <code>'value'</code> を出力します。<code><var>foo</var></code> と <code><var>bar</var></code> は同じ文字列に変換されるからです。</p>
<pre class="brush: js">let foo = {unique_prop: 1}, bar = {unique_prop: 2}, object = {};
object[foo] = 'value'
console.log(object[bar])
</pre>
<p><a href="/ja/docs/Mozilla/Projects/SpiderMonkey">SpiderMonkey</a> JavaScript エンジンでは、この文字列は "<code>[object Object]</code>" となります。</p>
<h3 id="Method_binding">メソッドのバインド</h3>
<p>メソッドは、そのメソッドが所属するオブジェクトにバインドされているわけではありません。特に、 <code>this</code> はメソッド内で固定されていません。つまり、 <code>this</code> は必ずしもそのメソッドを含んでいるオブジェクトを参照しているとは限りません。 <code>this</code> は関数呼び出し時に「渡される」ものです。<a href="/ja/docs/Web/JavaScript/Reference/Operators/this#method_binding">メソッドのバインド</a>を参照してください。</p>
<h2 id="Examples">例</h2>
<h3 id="Bracket_notation_vs._eval">ブラケット表記法と <code>eval</code></h3>
<p>JavaScript 初心者はしばしば、代わりにブラケット表記法を使えるところで {{jsxref("eval", "eval()")}} を使用してしまう間違いを犯します。</p>
<p>例えば、以下のような構文がたくさんのスクリプトで見られます。</p>
<pre class="brush: js">x = eval('document.forms.form_name.elements.' + strFormControl + '.value')
</pre>
<p><code>eval()</code> は低速であり、可能な限り避けるべきです。また、 <code>strFormControl</code> は ID を必要としますが、フォームコントロールの名前と <code>id</code> は必須ではありません。代わりにブラケット表記法を使った方が良いでしょう。</p>
<pre class="brush: js">x = document.forms['form_name'].elements[strFormControl].value
</pre>
<h2 id="Specifications">仕様書</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">仕様書</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('ESDraft', '#sec-property-accessors', 'Property Accessors')}}</td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility">ブラウザーの互換性</h2>
<p>{{Compat("javascript.operators.property_accessors")}}</p>
<h2 id="See_also">関連情報</h2>
<ul>
<li>{{jsxref("Object")}}</li>
<li>{{jsxref("Object.defineProperty()")}}</li>
<li><a href="/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining">オプショナルチェイニング</a></li>
</ul>
|