* 仕様書

[REFS[
- [1] '''[CITE[Web IDL (Second Edition)]] ([TIME[2014-02-10 21:45:38 +09:00]] 版) <http://heycam.github.io/webidl/#NamedConstructor>'''
- [12] [CITE[Web IDL (Second Edition)]] ([TIME[2014-02-10 21:45:38 +09:00]] 版) <http://heycam.github.io/webidl/#named-constructors>
- [13] [CITE[Web IDL (Second Edition)]] ([TIME[2014-02-10 21:45:38 +09:00]] 版) <http://heycam.github.io/webidl/#dfn-named-constructor>
]REFS]

* 文脈

[3] [CODE(IDL)@en[[[NamedConstructor]]]] [[拡張属性]]は、[[インターフェイス]]に指定できます
[SRC[>>1]]。ただし[[コールバックインターフェイス]]には指定できません [SRC[>>1]]。

[5] 複数個[[拡張属性]]を指定できます [SRC[>>1]]。

* 引数

[2] [[識別子]]を指定するか、[[名前付き引数リスト]] ([[識別子]]と[[引数]]のリスト)
を指定するかのいずれかでなければなりません [SRC[>>1]]。[[識別子]]のみの場合は、
[[引数リスト]]が空であるものとみなされます [SRC[>>1]]。

[6] [[識別子]]は、他の[[インターフェイス]]の [CODE(IDL)@en[[[NamedConstructor]]]]
の[[識別子]]と同じであってはなりません [SRC[>>1]]。

[7] [[識別子]]は、[[インターフェイスオブジェクト]]を持つ[[インターフェイス]]や[[例外インターフェイスオブジェクト]]を持つ[[例外]]の[[識別子]]と同じであってはなりません
[SRC[>>1]]。

[8] [[識別子]]は、[[予約識別子]]であってはなりません [SRC[>>1]]。

;; [10] 同じ[[インターフェイス]]に異なる[[識別子]]の [CODE(IDL)@en[[[NamedConstructor]]]]
が存在することは禁止されていません。

;; [11] 同じ[[インターフェイス]]に [CODE(IDL)@en[[[Constructor]]]]
が存在することも禁止されていません。

;; [15] [[辞書コンストラクター]]や、[[大域オブジェクト]]が[[実装]]する[[インターフェイス]]や[[派生的インターフェイス群]]の[[インターフェイスメンバー]]と衝突することもなぜか禁止されていません。

* 効果

[4] [[大域オブジェクト]]に[[識別子]]で指定された名前の[[特性]]があって、
その値が当該[[インターフェイス]]を[[実装]]した[[オブジェクト]]を作る[[コンストラクター関数]]となることを表します
[SRC[>>1]]。

[9] 同じ[[識別子]]の[[拡張属性]]が複数ある場合には、 [[overload]]
と解釈されます。

* 名前付きコンストラクター

[14] [[晒される]]状態にある[[インターフェイス]]で [CODE(IDL)@en[[[NamedConstructor]]]]
[[拡張属性]]があるものは、[[大域オブジェクト]]のその[[識別子]]と同じ名前の[[特性]]に
[CODE(JS)@en[[[Function]]]] が設定されます。 [SRC[>>12, >>13]]

[16] [[名前付き構築子]]は、[[初期オブジェクト]]です。

[17] 次のものがあります。
[FIG(short list)[
- [CODE(DOMi)@en[Audio]]
- [CODE(DOMi)@en[Image]]
- [CODE(DOMi)@en[Option]]
]FIG]

[18] [CITE@en[Revamp interface bindings (#313)]]
([[tobie]]著, [TIME[2017-02-21 07:17:07 +09:00]])
<https://github.com/heycam/webidl/commit/4a8f57e276369db7ea5fb09974a09b0ca5d276dd>

[19] [CITE@en[Clarify object creation in named constructors (#652)]]
([[Ms2ger]]著, [TIME[2019-02-25 23:05:59 +09:00]])
<https://github.com/heycam/webidl/commit/c9246d42fb9c0e399bb9b762f76917c9f43534e3>

[20] [CITE@en[Clarify object creation in named constructors by Ms2ger · Pull Request #652 · heycam/webidl]]
([TIME[2019-06-21 17:07:45 +09:00]])
<https://github.com/heycam/webidl/pull/652>

[21] [CITE@en[Disallow combining Global with Constructor/NamedConstructor. (#745)]]
([[Ms2ger]]著, [TIME[2019-06-28 04:28:25 +09:00]])
<https://github.com/heycam/webidl/commit/a029460787be46f850abfc60f35cc6da05145b89>

[22] [CITE@en[Disallow combining Global with Constructor/NamedConstructor. by Ms2ger · Pull Request #745 · heycam/webidl]]
([TIME[2020-01-12 14:59:09 +09:00]])
<https://github.com/heycam/webidl/pull/745>

[23] [CITE@en[Should make it clear that '''['''Global''']''' and '''['''Constructor''']''' can't coexist · Issue #744 · heycam/webidl]]
([TIME[2020-01-12 14:59:37 +09:00]])
<https://github.com/heycam/webidl/issues/744>

[24] [CITE@en[Stop using extended attributes for constructors]]
([[Ms2ger]]著, [TIME[2019-03-26 23:26:37 +09:00]])
<https://github.com/heycam/webidl/commit/91ca6ebb4d4fca9703309e19256bbc5f5dd77e3c>