teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

直属の `enumerable` 値を見ない場合がある

2019/12/06 12:06

投稿

think49
think49

スコア18194

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

2019/12/06 12:06

投稿

think49
think49

スコア18194

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修正

2019/12/06 11:49

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  > また、オブジェクトのプロパティを順に処理する際、プロトタイプチェーンにあるすべての列挙可能なプロパティが列挙されます。
2
2
 
3
3
  代表的なものは既出の通り、`for-in` ですが、MDNでは特定の機能に限定していません。
4
- 重要なのは「プロトタイプチェーンを辿る機能」と「プロトタイプチェーンを辿らない機能」を区別してsaw覚えることですので、この一文にこだわる必要はないと思います。
4
+ 重要なのは「プロトタイプチェーンを辿る機能」と「プロトタイプチェーンを辿らない機能」を区別して覚えることですので、この一文にこだわる必要はないと思います。
5
5
  例えば、プロパティ名が分かっているオブジェクトに対して、プロパティの初期化を行うとして、次のコードを書いた場合、
6
6
 
7
7
  ```JavaScript