回答編集履歴
3
直属の `enumerable` 値を見ない場合がある
answer
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
```
|
33
33
|
|
34
34
|
`for-in` は「プロトタイプチェーンを辿る機能」ですが、`hasOwnProperty` を併用する事で、プロトタイプチェーンを辿らない直属のプロパティを対象にします。
|
35
|
-
これはほぼ `Object.keys()` と同じ振る舞いをしますが、「直属の `enumerable` 値を見ない」という違いがあるので、完全に挙動をあわせるには下記コードに変えます。
|
35
|
+
これはほぼ `Object.keys()` と同じ振る舞いをしますが、「直属の `enumerable` 値を見ない場合がある」という違いがあるので、完全に挙動をあわせるには下記コードに変えます。
|
36
36
|
|
37
37
|
```JavaScript
|
38
38
|
for (var key in object) {
|
2
for-in
answer
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
### プロトタイプチェーンを辿る機能
|
2
|
+
|
1
3
|
> また、オブジェクトのプロパティを順に処理する際、プロトタイプチェーンにあるすべての列挙可能なプロパティが列挙されます。
|
2
4
|
|
3
5
|
代表的なものは既出の通り、`for-in` ですが、MDNでは特定の機能に限定していません。
|
@@ -13,9 +15,33 @@
|
|
13
15
|
`object.a` がプロトタイプ上のプロパティであった場合、`object[keys[i]]` はプロトタイプ上のプロパティを参照します。
|
14
16
|
プロパティアクセサは**プロトタイプチェーンを辿る**からです。
|
15
17
|
|
18
|
+
### プロトタイプチェーンを辿らない機能
|
19
|
+
|
16
20
|
> hasOwnProperty は JavaScript において唯一、プロトタイプチェーンを通らずにプロパティを扱うものです。
|
17
21
|
|
18
22
|
MDNでは上のように説明していますが、これは「間違い」で、`Object.keys()` や `Object.getOwnPropertyNames()` など、**プロトタイプチェーンを辿らない機能**は他にもあります。
|
23
|
+
|
24
|
+
`Object.keys()` が実装されていないブラウザのシェアが高かった時代、`Object.keys()` の代用として次のコードが書かれていました。
|
25
|
+
|
26
|
+
```JavaScript
|
27
|
+
for (var key in object) {
|
28
|
+
if (object.hasOwnProperty(key)) {
|
29
|
+
// 処理
|
30
|
+
}
|
31
|
+
}
|
32
|
+
```
|
33
|
+
|
34
|
+
`for-in` は「プロトタイプチェーンを辿る機能」ですが、`hasOwnProperty` を併用する事で、プロトタイプチェーンを辿らない直属のプロパティを対象にします。
|
35
|
+
これはほぼ `Object.keys()` と同じ振る舞いをしますが、「直属の `enumerable` 値を見ない」という違いがあるので、完全に挙動をあわせるには下記コードに変えます。
|
36
|
+
|
37
|
+
```JavaScript
|
38
|
+
for (var key in object) {
|
39
|
+
if (object.hasOwnProperty(key) && Object.getOwnPropertyDescriptor(object, key).enumerable) {
|
40
|
+
// 処理
|
41
|
+
}
|
42
|
+
}
|
43
|
+
```
|
44
|
+
|
19
45
|
ある関数、演算子が「プロトタイプチェーンを辿るのか」という観点で再調査してみると、見えてくるものがあると思います。
|
20
46
|
|
21
47
|
Re: slimat さん
|
1
typo修正
answer
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
> また、オブジェクトのプロパティを順に処理する際、プロトタイプチェーンにあるすべての列挙可能なプロパティが列挙されます。
|
2
2
|
|
3
3
|
代表的なものは既出の通り、`for-in` ですが、MDNでは特定の機能に限定していません。
|
4
|
-
重要なのは「プロトタイプチェーンを辿る機能」と「プロトタイプチェーンを辿らない機能」を区別して
|
4
|
+
重要なのは「プロトタイプチェーンを辿る機能」と「プロトタイプチェーンを辿らない機能」を区別して覚えることですので、この一文にこだわる必要はないと思います。
|
5
5
|
例えば、プロパティ名が分かっているオブジェクトに対して、プロパティの初期化を行うとして、次のコードを書いた場合、
|
6
6
|
|
7
7
|
```JavaScript
|