質問: JavaScriptでは単一の継承しかできない等の他の言語との違いがあるため、オブジェクト指向設計の理解に苦労しています。 中でもインターフェースはどのように実現すればよいのでしょうか。 初学者であるため前提理解の無い抽象的な質問ではありますが、関連事項や連想される内容でも構いませんので回答よろしくお願いします。
回答: ### 要件定義 まず、「インターフェース」を**要件定義**しましょう。 「JavaScriptにない用語」を他言語と同じように使うのは混乱の元です。 ### ECMAScript 2019 ES2019では「将来の予約語」に `interface` があります。 この時点では、まだ使えません。 * 11.6.2.2 Future Reserved Words - ECMAScript® 2019 Language Specification ES2019上に「Interface」の定義はありませんが、 * 4.3 Terms and Definitions - ECMAScript® 2019 Language Specification 文脈上で「Interface」を見ることは出来ます。 例えば、**Iterable Interface** * 25.1.1.1 The Iterable Interface - ECMAScript® 2019 Language Specification * Symbol.iterator - JavaScript | MDN ``` Symbol.iterator ``` ### DOM Level 3 Core DOMは複数言語に適用可能なモデルであり、「Interface」があります。 やや古いですが、DOM Level 3 Coreでは、**ECMAScriptにおける実装手段**に言及されています。 * 附属書H ECMAScript言語バインディング - Document Object Model (DOM) Level 3 Core Specification 1.0 基本は関数オブジェクトですが、コンストラクタと非コンストラクタの二種類存在します。 ``` console.log(typeof DOMException, typeof Node); // "function" "function" console.log(new DOMException); // DOMExceptionのインスタンス new Node; // TypeError: Illegal constructor ``` プロトタイプベース言語は、`[[Prototype]]` 上にオブジェクトがあれば良いので、必ずしもコンストラクタ呼び出し出来る必要はありません。 ``` class Foo {} class Piyo { constructor () { throw new TypeError('Illegal constructor'); } } console.log(new Foo); // Fooのインスタンス new Piyo; // TypeError: Illegal constructor ``` Re: kiahi39 さん