WEBVTT

1
00:00:00.000 --> 00:00:00.940
こんにちは。

2
00:00:00.940 --> 00:00:04.074
今回はイズエクステンシブルを紹介します。

3
00:00:04.074 --> 00:00:09.872
これは、オブジェクトに新しい項目を追加できるかどうかを調べるメソッドです。

4
00:00:09.872 --> 00:00:18.177
ライブラリーから受け取ったオブジェクトに項目を追加しようとして、タイプエラーになった経験はないでしょうか。

5
00:00:18.177 --> 00:00:23.974
ここでいう拡張とは、オブジェクト自身のプロパティを新しく追加することです。

6
00:00:23.974 --> 00:00:30.242
既存の値を書き換えられるか、入れ子のデータを変更できるかとは別の状態を表します。

7
00:00:30.242 --> 00:00:35.727
この動画では、書き方と戻り値、三つの状態を比べる基本例、判定結果の正しい読み方、

8
00:00:35.727 --> 00:00:41.211
そして判定自体が失敗する場面まで、実行結果と一緒に学びます。

9
00:00:41.211 --> 00:00:46.852
設定に診断用の項目を追加できない原因を探すような場面が、その代表例です。

10
00:00:46.852 --> 00:00:48.725
まず動作環境を確認します。

11
00:00:48.725 --> 00:00:53.625
このメソッドはジャバスクリプトの標準組み込み関数で、ブラウザーとノード・ジェイエスの両方で利用でき、

12
00:00:53.625 --> 00:00:58.524
ドムや外部パッケージに依存しません。

13
00:00:58.524 --> 00:01:04.721
エムディーエヌでは、二千十五年七月からブラウザー間で広く利用可能な機能とされています。

14
00:01:04.721 --> 00:01:08.684
この記事のコードは、現在のクローム、エッジ、ファイアーフォックス、サファリと、

15
00:01:08.684 --> 00:01:12.647
ノード二十二以降を対象にします。

16
00:01:12.647 --> 00:01:17.114
注意点として、古い実装ではプリミティブ値の扱いに差があります。

17
00:01:17.114 --> 00:01:21.365
イーシーマスクリプト・ファイブではオブジェクト以外を渡すと例外でしたが、

18
00:01:21.365 --> 00:01:25.616
二千十五以降はフォルスを返す仕様になりました。

19
00:01:25.616 --> 00:01:27.139
書き方を確認します。

20
00:01:27.139 --> 00:01:33.991
オブジェクトという名前の後にイズエクステンシブルと書き、カッコの中に調べたい値を渡します。

21
00:01:33.991 --> 00:01:38.863
インスタンスのメソッドではなく、オブジェクトから呼び出す形です。

22
00:01:38.863 --> 00:01:43.736
戻り値がトゥルーなら対象は拡張可能、フォルスなら拡張不可能です。

23
00:01:43.736 --> 00:01:50.892
ただしイーシーマスクリプト二千十五以降では、オブジェクト以外を渡した場合もフォルスになります。

24
00:01:50.892 --> 00:01:59.267
通常のオブジェクトは作成時点では拡張可能で、追加禁止や封印、凍結といった処理を受けたものがフォルスになります。

25
00:01:59.267 --> 00:02:04.596
この判定は同期処理で、調べるだけなので対象を変更することはありません。

26
00:02:04.596 --> 00:02:06.498
記事の基本例を見ます。

27
00:02:06.498 --> 00:02:10.992
通常のオブジェクト、追加禁止にしたオブジェクト、凍結したオブジェクトの三つを用意し、

28
00:02:10.992 --> 00:02:15.487
それぞれ判定します。

29
00:02:15.487 --> 00:02:22.747
結果は、通常のオブジェクトだけがトゥルーで、追加禁止と凍結はどちらもフォルスでした。

30
00:02:22.747 --> 00:02:26.896
さらに、数値とヌルを渡してもフォルスが返ります。

31
00:02:26.896 --> 00:02:30.526
数値やヌルはオブジェクトではないためです。

32
00:02:30.526 --> 00:02:34.329
実機でも記事の期待出力とすべて一致しました。

33
00:02:34.329 --> 00:02:41.416
まず、調べたいオブジェクトが今どの状態にあるのかを、この判定で素早く確認できます。

34
00:02:41.416 --> 00:02:45.565
追加できない原因を探すときの最初の手掛かりです。

35
00:02:45.565 --> 00:02:53.344
なお、フォルスだけでは入力がオブジェクトかどうかまでは区別できない点も覚えておきましょう。

36
00:02:53.344 --> 00:02:54.654
基本例の続きです。

37
00:02:54.654 --> 00:03:00.621
追加禁止のオブジェクトでも、もともとあるテーマという項目はダークに更新できました。

38
00:03:00.621 --> 00:03:04.114
既存値の更新と、新規項目の追加は別の話なのです。

39
00:03:04.114 --> 00:03:11.246
一方、デバッグという新しい項目を追加しようとすると、ストリクトモードではタイプエラーになりました。

40
00:03:11.246 --> 00:03:15.539
例外を捕捉しているため処理は続き、追加後のデバッグを読むとアンディファインドで、

41
00:03:15.539 --> 00:03:19.833
項目が作られていないことが分かります。

42
00:03:19.833 --> 00:03:22.598
実機でも記事の期待出力と一致しました。

43
00:03:22.598 --> 00:03:27.692
拡張不可は、すべての変更ができないという意味ではない点がポイントです。

44
00:03:27.692 --> 00:03:29.885
フォルスになる処理を整理します。

45
00:03:29.885 --> 00:03:34.957
プリベントエクステンションズで追加を禁止したもの、シールで封印したもの、

46
00:03:34.957 --> 00:03:40.029
フリーズで凍結したものは、いずれもイズエクステンシブルがフォルスを返します。

47
00:03:40.029 --> 00:03:43.730
実機でも封印したオブジェクトでフォルスを確認しました。

48
00:03:43.730 --> 00:03:47.157
ただし、フォルス同士でも中身は同じではありません。

49
00:03:47.157 --> 00:03:52.914
追加禁止や封印では既存の書き込み可能な値は更新できますが、凍結では更新もできません。

50
00:03:52.914 --> 00:03:59.631
つまり、この判定で分かるのは新規追加の可否だけで、既存項目の書き換え可否までは区別できないのです。

51
00:03:59.631 --> 00:04:02.784
用途に応じて、別の確認と組み合わせてください。

52
00:04:02.784 --> 00:04:06.463
判定結果の読み方でよくある誤解を取り上げます。

53
00:04:06.463 --> 00:04:11.421
フォルスを、すべて変更不可という意味に解釈してしまうことです。

54
00:04:11.421 --> 00:04:16.539
先ほどの例でも、追加禁止のオブジェクトは既存値を更新できました。

55
00:04:16.539 --> 00:04:23.737
もし診断画面でこの結果だけを使って読み取り専用と表示すると、利用者を誤解させてしまいます。

56
00:04:23.737 --> 00:04:30.775
適切なのは、新規項目の追加不可と表示し、特定項目の更新可否は別の情報として扱うことです。

57
00:04:30.775 --> 00:04:39.412
判定結果が何を意味し、何を意味しないのかを言葉で正確に表すことが、調査結果を正しく伝えることにつながります。

58
00:04:39.412 --> 00:04:41.960
失敗を見落とす落とし穴も確認します。

59
00:04:41.960 --> 00:04:49.604
拡張できないオブジェクトへ代入で新規項目を追加しようとしたとき、ストリクトモードではタイプエラーになります。

60
00:04:49.604 --> 00:04:54.841
しかしストリクトモードでない場合は、追加が黙って無視され、例外は出ません。

61
00:04:54.841 --> 00:04:59.795
つまり、例外が出なかったことを、追加に成功した根拠にはできないのです。

62
00:04:59.795 --> 00:05:07.014
記事の実行例では、関数の中にユーズストリクトを置くことで、失敗を例外として観察できるようにしています。

63
00:05:07.014 --> 00:05:15.224
追加できたかどうかを確かめたいときは、判定メソッドで状態を確認するか、ストリクトモードで例外を捕捉するのが確実です。

64
00:05:15.224 --> 00:05:19.186
トゥルーという結果の読み方にも注意が必要です。

65
00:05:19.186 --> 00:05:25.903
拡張可能という判定は、特定のプロパティ名への代入が成功することを保証しません。

66
00:05:25.903 --> 00:05:34.343
既存プロパティの書き込み制限や、継承したアクセサー、プロキシによる制御などが別に関係するからです。

67
00:05:34.343 --> 00:05:38.305
また、判定はその時点の状態を示すにすぎません。

68
00:05:38.305 --> 00:05:44.334
判定の後、別の処理で追加禁止にされれば、以前の結果は使えなくなります。

69
00:05:44.334 --> 00:05:52.429
特に、判定と代入の間にアウェイトを挟む設計では、結果を長期間保存して使わないようにしましょう。

70
00:05:52.429 --> 00:05:57.252
実際の更新処理では、例外処理を残しておくことが大切です。

71
00:05:57.252 --> 00:05:59.870
判定そのものが失敗する例を見ます。

72
00:05:59.870 --> 00:06:05.261
プロキシでは、イズエクステンシブルのトラップが呼ばれることがあります。

73
00:06:05.261 --> 00:06:10.344
その結果が対象の実際の拡張性と矛盾すると、タイプエラーになります。

74
00:06:10.344 --> 00:06:15.196
スライドの例では、空のオブジェクト、つまり本来は拡張可能な対象に対して、

75
00:06:15.196 --> 00:06:20.047
トラップがフォルスを返すため、判定が例外になりました。

76
00:06:20.047 --> 00:06:24.360
実機でも記事の期待出力どおりタイプエラーを確認しました。

77
00:06:24.360 --> 00:06:32.061
任意のオブジェクトを受け取る診断ツールでは、判定処理そのものにも例外への備えが必要だということです。

78
00:06:32.061 --> 00:06:37.144
安全そうに見える確認用の関数ほど、想定外の入力を意識してください。

79
00:06:37.144 --> 00:06:37.975
まとめです。

80
00:06:37.975 --> 00:06:43.518
イズエクステンシブルは、オブジェクトに新規項目を追加できるかを返すメソッドです。

81
00:06:43.518 --> 00:06:44.904
ポイントは三つです。

82
00:06:44.904 --> 00:06:50.724
まず、追加禁止・封印・凍結でフォルスになり、オブジェクト以外でもフォルスになること。

83
00:06:50.724 --> 00:06:57.099
次に、フォルスでも既存値の更新はできる場合があり、トゥルーでも代入の成功は保証されないこと。

84
00:06:57.099 --> 00:07:01.256
そして、プロキシでは判定自体が例外になる場合があることです。

85
00:07:01.256 --> 00:07:07.769
活用場面では、受け取り直後と加工直前で状態を記録すると、追加できなくなった段階を絞り込めます。

86
00:07:07.769 --> 00:07:12.480
まずは記事の基本例を実行し、結果を予測してから確かめてみてください。

87
00:07:12.480 --> 00:07:13.727
お疲れさまでした。

88
00:07:13.727 --> 00:07:18.716
判定を設計の改善につなげる姿勢が、使いどころの判断を確かなものにします。
