diff options
Diffstat (limited to 'files')
-rw-r--r-- | files/ja/web/javascript/guide/meta_programming/index.html | 213 |
1 files changed, 117 insertions, 96 deletions
diff --git a/files/ja/web/javascript/guide/meta_programming/index.html b/files/ja/web/javascript/guide/meta_programming/index.html index c0b3b18129..253ed92922 100644 --- a/files/ja/web/javascript/guide/meta_programming/index.html +++ b/files/ja/web/javascript/guide/meta_programming/index.html @@ -7,22 +7,22 @@ tags: - JavaScript - Proxy - Reflect - - 'l10n:priority' + - l10n:priority translation_of: Web/JavaScript/Guide/Meta_programming --- -<div>{{jsSidebar("JavaScript Guide")}} {{Previous("Web/JavaScript/Guide/Iterators_and_Generators")}}</div> +<div>{{jsSidebar("JavaScript Guide")}}{{PreviousNext("Web/JavaScript/Guide/Iterators_and_Generators", "Web/JavaScript/Guide/Modules")}}</div> -<p class="summary">ECMAScript 2015 から、JavaScript には {{jsxref("Proxy")}} オブジェクトと {{jsxref("Reflect")}} オブジェクトがサポートされました。これらは基本的な言語操作(例えば、プロパティ検索、代入、列挙、関数呼び出しなど)に割り込み、動作をカスタマイズできます。この 2 つのオブジェクトのおかげで、JavaScript でメタレベルのプログラミングが行えます。</p> +<p class="summary">ECMAScript 2015 から、JavaScript には {{jsxref("Proxy")}} オブジェクトと {{jsxref("Reflect")}} オブジェクトがサポートされました。これらは基本的な言語操作 (例えば、プロパティ参照、代入、列挙、関数呼び出しなど) に割り込み、動作をカスタマイズすることができます。この 2 つのオブジェクトのおかげで、JavaScript でメタレベルのプログラミングが行えます。</p> -<h2 id="Proxies" name="Proxies">Proxy</h2> +<h2 id="Proxies">プロキシー</h2> -<p>ECMAScript 6 で導入された {{jsxref("Proxy")}} オブジェクトによって、特定の操作に割り込んで動作をカスタマイズできます。</p> +<p>ECMAScript 6 で導入された {{jsxref("Proxy")}} オブジェクトによって、特定の操作に割り込んで動作をカスタマイズすることができます。</p> -<p>例えば、オブジェクトのプロパティを取得してみましょう :</p> +<p>例えば、オブジェクトのプロパティを取得してみましょう。</p> -<pre class="brush: js notranslate">let <var>handler</var> = { +<pre class="brush: js">let <var>handler</var> = { get: function(<var>target</var>, name) { - return name in <var>target</var>? <var>target</var>[name] : 42 + return name in <var>target</var> ? <var>target</var>[name] : 42 } } @@ -31,141 +31,155 @@ p.a = 1 console.log(p.a, p.b) // 1, 42 </pre> -<p>この <code>Proxy</code> オブジェクトは <code>target</code>(ここでは空オブジェクト)と <code>get</code> トラップが実装された <code>handler</code> オブジェクトを定義しています。ここで、プロキシとなったオブジェクトは未定義のプロパティを取得しようとした時 <code>undefined</code> を返さず、代わりに数値 42 を返します。</p> +<p>この <code>Proxy</code> オブジェクトは <dfn><code><var>target</var></code></dfn> (ここでは空オブジェクト) と <dfn><code><var>handler</var></code></dfn> オブジェクトを定義し、その中に <code>get</code> トラップが実装されています。ここで、プロキシーとなったオブジェクトは未定義のプロパティを取得しようとした時に <code>undefined</code> を返さず、代わりに数値 <code>42</code> を返します。</p> -<p>さらなる使用例がリファレンスの「{{jsxref("Proxy")}}」ページにあります。</p> +<p>それ以外の例は {{jsxref("Proxy")}} のリファレンスページを参照してください。</p> -<h3 id="Terminology" name="Terminology">用語集</h3> +<h3 id="Terminology">用語集</h3> -<p>プロキシの機能について話題にする際は、次の用語が使用されます。</p> +<p>プロキシーの機能について話題にする際は、次の用語が使用されます。</p> <dl> - <dt>{{jsxref("Global_Objects/Proxy/handler","ハンドラ","","true")}} <span>(handler)</span></dt> + <dt>{{jsxref("Global_Objects/Proxy/Proxy","ハンドラー","","true")}} (handler)</dt> <dd>トラップを入れるためのプレースホルダ用オブジェクト。</dd> - <dt>{{原語併記("トラップ","trap")}}</dt> - <dd>プロパティへのアクセスを提供するメソッド。オペレーティングシステムにおけるトラップの概念と同じようなものです。</dd> - <dt>{{原語併記("ターゲット","target")}}</dt> - <dd>プロキシが仮想化するオブジェクト。これはプロキシのストレージバックエンドとしてしばしば使われます。拡張・設定可能でないプロパティを持つオブジェクトに関する不変条件(変更されないセマンティック、つまりオブジェクトの意味情報)は、このターゲットに対して検証されます。</dd> - <dt>{{原語併記("不変条件","invariant")}}</dt> - <dd>カスタマイズした動作を実装する際、変更されないセマンティックを<strong>不変条件</strong>と呼びます。ハンドラの不変条件に違反した場合、{{jsxref("TypeError")}} が発生します。</dd> + <dt>トラップ (trap)</dt> + <dd>プロパティへのアクセスを提供するメソッドです。 (オペレーティングシステムにおける<em>トラップ</em>の概念と同じようなものです。)</dd> + <dt>ターゲット (<var>target</var>)</dt> + <dd>プロキシーが仮想化するオブジェクトです。多くの場合、プロキシーのストレージバックエンドとして使用されます。拡張や設定できないオブジェクトのプロパティの不変条件 (変更されない意味) がターゲットに対して検証されます。</dd> + <dt>不変条件 (invariant)</dt> + <dd>独自の操作を実装した際に変更されない意味を<strong>不変条件</strong>と呼びます。ハンドラーの不変条件に違反した場合、 {{jsxref("TypeError")}} が発生します。</dd> </dl> -<h2 id="Handlers_and_traps" name="Handlers_and_traps">ハンドラとトラップ</h2> +<h2 id="Handlers_and_traps">ハンドラーとトラップ</h2> -<p>次の表は、<code>Proxy</code> オブジェクトに対して利用可能なトラップをまとめたものです。詳細と例についてはリファレンスの<a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler">ハンドラについてのページ</a>をご覧ください。</p> +<p>次の表は、 <code>Proxy</code> オブジェクトに対して利用可能なトラップをまとめたものです。詳細な説明と例については、<a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy">リファレンスページ</a>を参照してください。</p> <table class="standard-table"> <thead> <tr> - <th>ハンドラ / トラップ</th> + <th>ハンドラー / トラップ</th> <th>割り込みされる処理</th> <th>不変条件</th> </tr> </thead> <tbody> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/getPrototypeOf", "handler.getPrototypeOf()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/getPrototypeOf", "handler.getPrototypeOf()")}}</td> <td>{{jsxref("Object.getPrototypeOf()")}}<br> {{jsxref("Reflect.getPrototypeOf()")}}<br> {{jsxref("Object/proto", "__proto__")}}<br> {{jsxref("Object.prototype.isPrototypeOf()")}}<br> {{jsxref("Operators/instanceof", "instanceof")}}</td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <ul> <li><code>getPrototypeOf</code> メソッドはオブジェクトか <code>null</code> を返す必要があります。</li> - <li><code>target</code> が拡張不可の場合、<code>Object.getPrototypeOf(proxy)</code> メソッドは <code>Object.getPrototypeOf(target)</code> と同じ値を返す必要があります。</li> + <li><code><var>target</var></code> が拡張できない場合、<code>Object.getPrototypeOf(<var>proxy</var>)</code> メソッドは <code>Object.getPrototypeOf(<var>target</var>)</code> と同じ値を返す必要があります。</li> </ul> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/setPrototypeOf", "handler.setPrototypeOf()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/setPrototypeOf", "handler.setPrototypeOf()")}}</td> <td>{{jsxref("Object.setPrototypeOf()")}}<br> {{jsxref("Reflect.setPrototypeOf()")}}</td> - <td><code>target</code> が拡張不可の場合、<code>prototype</code> パラメータは <code>Object.getPrototypeOf(target)</code> と同じ値である必要があります。</td> + <td><code><var>target</var></code> が拡張できない場合、<code>prototype</code> パラメータは <code>Object.getPrototypeOf(<var>target</var>)</code> と同じ値である必要があります。</td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/isExtensible", "handler.isExtensible()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/isExtensible", "handler.isExtensible()")}}</td> <td>{{jsxref("Object.isExtensible()")}}<br> {{jsxref("Reflect.isExtensible()")}}</td> - <td><code>Object.isExtensible(proxy)</code> は <code>Object.isExtensible(target)</code> と同じ値を返す必要があります。</td> + <td><code>Object.isExtensible(<var>proxy</var>)</code> は <code>Object.isExtensible(<var>target</var>)</code> と同じ値を返す必要があります。</td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/preventExtensions", "handler.preventExtensions()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/preventExtensions", "handler.preventExtensions()")}}</td> <td>{{jsxref("Object.preventExtensions()")}}<br> {{jsxref("Reflect.preventExtensions()")}}</td> <td> - <p><code>Object.isExtensible(proxy)</code> が <code>false</code> の場合のみ、<code>Object.preventExtensions(proxy)</code> は <code>true</code> を返します。</p> + <p><code>Object.isExtensible(<var>proxy</var>)</code> が <code>false</code> の場合のみ、<code>Object.preventExtensions(<var>proxy</var>)</code> は <code>true</code> を返します。</p> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/getOwnPropertyDescriptor", "handler.getOwnPropertyDescriptor()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor", "handler.getOwnPropertyDescriptor()")}}</td> <td>{{jsxref("Object.getOwnPropertyDescriptor()")}}<br> {{jsxref("Reflect.getOwnPropertyDescriptor()")}}</td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <ul> <li><code>getOwnPropertyDescriptor</code> はオブジェクトか <code>undefined</code> のいずれかを返す必要があります。</li> <li>ターゲットオブジェクトに設定不可の所有プロパティとして存在する場合、そのプロパティについて存在しないと報告することはできません。</li> <li>拡張不可のターゲットオブジェクトに所有プロパティとして存在する場合、そのプロパティについて存在しないと報告することはできません。</li> <li>拡張不可のターゲットオブジェクトに所有プロパティとして存在しない場合、そのプロパティについて存在すると報告することはできません。</li> <li>ターゲットオブジェクトに所有プロパティとして存在しない場合、あるいはターゲットオブジェクトに設定可能な所有プロパティとして存在する場合、そのプロパティについて設定不可と報告することはできません。</li> - <li><code>Object.getOwnPropertyDescriptor(target)</code> の結果は <code>Object.defineProperty</code> を使用してターゲットオブジェクトに適用され、この時に例外は発生しません。</li> + <li><code>Object.getOwnPropertyDescriptor(<var>target</var>)</code> の結果は <code>Object.defineProperty</code> を使用してターゲットオブジェクトに適用され、この時に例外は発生しません。</li> </ul> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/defineProperty", "handler.defineProperty()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/defineProperty", "handler.defineProperty()")}}</td> <td>{{jsxref("Object.defineProperty()")}}<br> {{jsxref("Reflect.defineProperty()")}}</td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <ul> <li>ターゲットオブジェクトが拡張可能ではない場合、プロパティは追加できません。</li> <li>ターゲットオブジェクトに設定不可の所有プロパティとして存在しない場合、そのプロパティを追加したり、また設定不可に更新することはできません。</li> <li>ターゲットオブジェクトに対応する設定可能なプロパティとして存在する場合、そのプロパティを設定不可としてもかまいません。</li> - <li>プロパティが対応するターゲットオブジェクトプロパティを持つ場合、<code>Object.defineProperty(target, prop, descriptor)</code> は例外を発生しません。</li> - <li>strict モードでは、<code>defineProperty</code> ハンドラからの戻り値が <code>false</code> の場合、{{jsxref("TypeError")}} 例外が発生します。</li> + <li>プロパティが対応するターゲットオブジェクトプロパティを持つ場合、<code>Object.defineProperty(<var>target</var>, <var>prop</var>, <var>descriptor</var>)</code> は例外を発生しません。</li> + <li>strict モードでは、<code>defineProperty</code> ハンドラーからの返値が <code>false</code> の場合、{{jsxref("TypeError")}} 例外が発生します。</li> </ul> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/has", "handler.has()")}}</td> - <td>プロパティの照会 :<br> - <code>foo in proxy</code><br> - 継承されたプロパティの照会 :<br> - <code>foo in Object.create(proxy)</code><br> - {{jsxref("Reflect.has()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/has", "handler.has()")}}</td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <dl> + <dt>プロパティの照会</dt> + <dd><code>foo in proxy</code></dd> + <dt>継承されたプロパティの照会</dt> + <dd><code>foo in Object.create(<var>proxy</var>)</code><br> + {{jsxref("Reflect.has()")}}</dd> + </dl> + </td> + <td> + <ul> <li>ターゲットオブジェクトに設定不可の所有プロパティとして存在する場合、そのプロパティについて存在しないと報告することはできません。</li> <li>ターゲットオブジェクトの所有プロパティとして存在し、そのターゲットオブジェクトが拡張可能ではない場合、そのプロパティについて存在しないと報告することはできません。</li> </ul> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/get", "handler.get()")}}</td> - <td>プロパティへのアクセス :<br> - <code>proxy[foo]</code>and <code>proxy.bar</code><br> - 継承されたプロパティアクセス :<br> - <code>Object.create(proxy)[foo]</code><br> - {{jsxref("Reflect.get()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/get", "handler.get()")}}</td> + <td> + <dl> + <dt>プロパティへのアクセス</dt> + <dd><code><var>proxy</var>[foo]</code><br> + <code><var>proxy</var>.bar</code></dd> + <dt>継承されたプロパティへのアクセス</dt> + <dd><code>Object.create(<var>proxy</var>)[foo]</code><br> + {{jsxref("Reflect.get()")}}</dd> + </dl> + </td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <ul> <li>ターゲットオブジェクトプロパティが書込不可、設定不可のデータプロパティである場合、プロパティに対して報告する値は対応するプロパティと同じ値である必要があります。</li> <li>対応するターゲットオブジェクトプロパティが、Get 属性に <code>undefined</code> を持つ設定不可のアクセサプロパティである場合、プロパティに対して報告される値を <code>undefined</code> とする必要があります。</li> </ul> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/set", "handler.set()")}}</td> - <td>プロパティへの代入 :<br> - <code>proxy[foo] = bar</code>, <code>proxy.foo = bar</code><br> - 継承されたプロパティの割り当て :<br> - <code>Object.create(proxy)[foo] = bar</code><br> - {{jsxref("Reflect.set()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/set", "handler.set()")}}</td> + <td> + <dl> + <dt>プロパティへの代入</dt> + <dd><code><var>proxy</var>[foo] = bar</code><br> + <code><var>proxy</var>.foo = bar</code></dd> + <dt>継承されたプロパティへの代入</dt> + <dd><code>Object.create(<var>proxy</var>)[foo] = bar</code><br> + {{jsxref("Reflect.set()")}}</dd> + </dl> + </td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <ul> <li>対応するターゲットオブジェクトのプロパティが書込不可、設定不可のデータプロパティである場合、そのプロパティとは違うプロパティ値に変更することはできません。</li> <li>対応するターゲットオブジェクトプロパティが、Set 属性に <code>undefined</code> を持つ設定不可のアクセサプロパティである場合、プロパティの値を設定することはできません。</li> - <li>strict モードでは、<code>set</code> ハンドラからの戻り値が <code>false</code> の場合、{{jsxref("TypeError")}} 例外が発生します。 + <li>strict モードでは、 <code>false</code> という返値が <code>set</code> ハンドラーから返された場合、{{jsxref("TypeError")}} 例外が発生します。 <ul> </ul> </li> @@ -173,46 +187,53 @@ console.log(p.a, p.b) // 1, 42 </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/deleteProperty", "handler.deleteProperty()")}}</td> - <td>プロパティの削除 :<br> - <code>delete proxy[foo]</code>, <code>delete proxy.foo</code><br> - {{jsxref("Reflect.deleteProperty()")}}</td> - <td>ターゲットオブジェクトに設定不可の所有プロパティとして存在する場合、削除することはできません。</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/deleteProperty", "handler.deleteProperty()")}}</td> + <td> + <dl> + <dt>プロパティの削除</dt> + <dd><code>delete <var>proxy</var>[foo]</code><br> + <code>delete <var>proxy</var>.foo</code><br> + {{jsxref("Reflect.deleteProperty()")}}</dd> + </dl> + </td> + <td><code><var>target</var></code> に構成不可の所有プロパティとして存在する場合、削除することはできません。</td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/enumerate", "handler.enumerate()")}}</td> - <td>プロパティの列挙 / for...in :<br> - <code>for (var name in proxy) {...}</code><br> - {{jsxref("Reflect.enumerate()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/enumerate", "handler.enumerate()")}}</td> + <td> + <dl> + <dt>プロパティの列挙 / <code>for...in</code>:</dt> + <dd><code>for (let name in <var>proxy</var>) {...}</code><br> + {{jsxref("Reflect.enumerate()")}}</dd> + </dl> + </td> <td><code>enumerate</code> メソッドはオブジェクトを返す必要があります。</td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/ownKeys", "handler.ownKeys()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/ownKeys", "handler.ownKeys()")}}</td> <td>{{jsxref("Object.getOwnPropertyNames()")}}<br> {{jsxref("Object.getOwnPropertySymbols()")}}<br> {{jsxref("Object.keys()")}}<br> {{jsxref("Reflect.ownKeys()")}}</td> <td> - <ul style="padding-left: 20px; margin: 5px;"> + <ul> <li><code>ownKeys</code> の結果はリストとなります。</li> <li>出力リストの要素の型は {{jsxref("String")}} か {{jsxref("Symbol")}} のどちらかとなります。</li> - <li>出力リストはターゲットオブジェクト中にあるすべての設定不可な所有プロパティのキーを含める必要があります。</li> - <li>ターゲットオブジェクトが拡張不可の場合、出力リストはターゲットオブジェクト中の所有プロパティのキーをすべて含める必要があり、他の値は含まれません。 - <ul> - </ul> + <li>出力リストは <code><var>target</var></code> のすべての設定不可の所有プロパティのキーを含める必要があります。</li> + <li>ターゲットオブジェクトが拡張できない場合、出力リストはターゲットオブジェクト中の所有プロパティのキーをすべて含める必要があり、他の値は含まれません。 </li> </ul> </td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/apply", "handler.apply()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/apply", "handler.apply()")}}</td> <td><code>proxy(..args)</code><br> {{jsxref("Function.prototype.apply()")}} and {{jsxref("Function.prototype.call()")}}<br> {{jsxref("Reflect.apply()")}}</td> - <td><code>handler.apply</code> メソッドに対する不変条件はありません。</td> + <td><code><var>handler</var>.apply</code> メソッドに対する不変条件はありません。</td> </tr> <tr> - <td>{{jsxref("Global_Objects/Proxy/handler/construct", "handler.construct()")}}</td> + <td>{{jsxref("Global_Objects/Proxy/Proxy/construct", "handler.construct()")}}</td> <td><code>new proxy(...args)</code><br> {{jsxref("Reflect.construct()")}}</td> <td>出力結果は <code>Object</code> とする必要があります。</td> @@ -220,13 +241,13 @@ console.log(p.a, p.b) // 1, 42 </tbody> </table> -<h2 id="Revocable_Proxy" name="Revocable_Proxy">取り消し可能 <code>Proxy</code></h2> +<h2 id="Revocable_Proxy">取り消し可能 <code>Proxy</code></h2> -<p>{{jsxref("Proxy.revocable()")}} メソッドは取り消し可能な <code>Proxy</code> オブジェクトの生成に使用されます。これにより、プロキシを <code>revoke</code> 関数で取り消し、プロキシの機能を停止することができます。</p> +<p>{{jsxref("Proxy.revocable()")}} メソッドは取り消し可能な <code>Proxy</code> オブジェクトの生成に使用されます。これにより、プロキシーを <code>revoke</code> 関数で取り消し、プロキシーの機能を停止することができます。</p> -<p>その後はプロキシを通じたいかなる操作も {{jsxref("TypeError")}} になります。</p> +<p>その後はプロキシーを通じたいかなる操作も {{jsxref("TypeError")}} になります。</p> -<pre class="brush: js notranslate">let revocable = Proxy.revocable({}, { +<pre class="brush: js">let revocable = Proxy.revocable({}, { get: function(target, name) { return '[[' + name + ']]' } @@ -242,29 +263,29 @@ delete proxy.foo // TypeError がここでも発生 typeof proxy // "object" が返され, typeof はどんなトラップも引き起こさない </pre> -<h2 id="Reflection" name="Reflection">リフレクション</h2> +<h2 id="Reflection">リフレクション</h2> -<p>{{jsxref("Reflect")}} は JavaScript で割り込み操作を行うメソッドを提供するビルトインオブジェクトです。そのメソッドは {{jsxref("Global_Objects/Proxy/handler","Proxy ハンドラ","","true")}}のメソッドと同じです。</p> +<p>{{jsxref("Reflect")}} は JavaScript で割り込み操作を行うメソッドを提供する組み込みオブジェクトです。そのメソッドは{{jsxref("Global_Objects/Proxy/Proxy","Proxy ハンドラー","","true")}}のメソッドと同じです。</p> <p><code>Reflect</code> は関数オブジェクトではありません。</p> -<p><code>Reflect</code> はハンドラから<code><var>ターゲット</var></code>へのデフォルト操作を転送するのに役立ちます。</p> +<p><code>Reflect</code> はハンドラーから<code><var>ターゲット</var></code>への既定の操作を転送するのに役立ちます。</p> -<p>例えば、{{jsxref("Reflect.has()")}} を使えば、<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/in"><code>in</code> 演算子</a>を関数として使うことができます :</p> +<p>例えば、{{jsxref("Reflect.has()")}} を使えば、<a href="/ja/docs/Web/JavaScript/Reference/Operators/in"><code>in</code> 演算子</a>を関数として使うことができます。</p> -<pre class="brush: js notranslate">Reflect.has(Object, 'assign') // true +<pre class="brush: js">Reflect.has(Object, 'assign') // true </pre> -<h3 id="A_better_apply_function" name="A_better_apply_function">より優れた <code>apply</code> 関数</h3> +<h3 id="A_better_apply_function">より優れた <code>apply</code> 関数</h3> -<p>ES5 では、所定の <code>this</code> 値と配列や<a href="/ja/docs/Web/JavaScript/Guide/Indexed_collections#Working_with_array-like_objects">配列様のオブジェクト</a>として提供される <code>arguments</code> を使って関数を呼び出す {{jsxref("Function.prototype.apply()")}} メソッドがよく使われてきました。</p> +<p>ES5 では、所定の <code>this</code> 値と配列や<a href="/ja/docs/Web/JavaScript/Guide/Indexed_collections#working_with_array-like_objects">配列風オブジェクト</a>として提供される <code>arguments</code> を使って関数を呼び出す {{jsxref("Function.prototype.apply()")}} メソッドがよく使われてきました。</p> -<pre class="brush: js notranslate">Function.prototype.apply.call(Math.floor, undefined, [1.75]) +<pre class="brush: js">Function.prototype.apply.call(Math.floor, undefined, [1.75]) </pre> -<p>{{jsxref("Reflect.apply")}} を使えば、より簡潔で分かりやすいものにできます :</p> +<p>{{jsxref("Reflect.apply")}} を使えば、より簡潔で分かりやすいものにできます。</p> -<pre class="brush: js notranslate">Reflect.apply(Math.floor, undefined, [1.75]) +<pre class="brush: js">Reflect.apply(Math.floor, undefined, [1.75]) // 1 Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]) @@ -277,14 +298,14 @@ Reflect.apply(''.charAt, 'ponies', [3]) // "i" </pre> -<h3 id="Checking_if_property_definition_has_been_successful" name="Checking_if_property_definition_has_been_successful">プロパティ定義の成否チェック</h3> +<h3 id="Checking_if_property_definition_has_been_successful">プロパティ定義の成否チェック</h3> -<p>成功した時はオブジェクトを返し、失敗した時は {{jsxref("TypeError")}} を発生させる {{jsxref("Object.defineProperty")}} では、プロパティを定義する際に発生するエラーを捉えるのに {{jsxref("Statements/try...catch","try...catch")}} ブロックを使おうとしていたでしょう。{{jsxref("Reflect.defineProperty")}} では成功したかどうかによって真偽値を返すので、ここでは {{jsxref("Statements/if...else","if...else")}} ブロックを使えます :</p> +<p>{{jsxref("Object.defineProperty")}} は成功すればオブジェクトを返し、そうでなければ {{jsxref("TypeError")}} を投げるので、 {{jsxref("Statements/try...catch","try...catch")}} ブロックを使って、プロパティの定義中に発生したエラーを捉えます。 {{jsxref("Reflect.defineProperty")}} は成功のステータスを論理値で返すので、ここでは {{jsxref("Statements/if...else","if...else")}} ブロックを使うだけでよいのです。</p> -<pre class="brush: js notranslate">if (Reflect.defineProperty(target, property, attributes)) { +<pre class="brush: js">if (Reflect.defineProperty(target, property, attributes)) { // 成功した時の処理 } else { // 失敗した時の処理 }</pre> -<p>{{Previous("Web/JavaScript/Guide/Iterators_and_Generators")}}</p> +<p>{{PreviousNext("Web/JavaScript/Guide/Iterators_and_Generators", "Web/JavaScript/Guide/Modules")}}</p> |