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

回答編集履歴

1

追記

2020/06/03 11:13

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -1,5 +1,50 @@
1
1
  > インターフェースは実現できますか?
2
2
 
3
+ # Object.setPrototypeOf()
4
+
5
+ 回答済みとなって久しいご質問でしたが、追記になります。
6
+
7
+ [DOM Standard](https://dom.spec.whatwg.org/)の ``IDL`` に ``interface mixin`` と示される実装を class ブロック構文でどのように実現しているのかを探っていたところ、``Object.setPrototypeOf()`` を利用すれば、以下のように、「振る舞い」を 別の class ブロックで定義できるようです。
8
+
9
+ ```javascript
10
+ class AnyInterface {
11
+
12
+ increment() {
13
+ this.data++;
14
+ }
15
+
16
+ decrement() {
17
+ this.data--;
18
+ }
19
+
20
+ }
21
+
22
+
23
+ class MyClass {
24
+
25
+ constructor ( data = 0 ) {
26
+ this.data = data;
27
+ }
28
+
29
+ }
30
+
31
+ // mixin interface を実現?
32
+ Object.setPrototypeOf( MyClass.prototype, AnyInterface.prototype );
33
+
34
+ // test
35
+ let myClass = new MyClass( 3 );
36
+ console.log( myClass.data ); // 3
37
+
38
+ myClass.increment();
39
+ console.log( myClass.data ); // 4
40
+
41
+ myClass.decrement();
42
+ console.log( myClass.data ); // 3
43
+ ```
44
+
45
+ ----
46
+ 以下、古い回答になります。
47
+
3
48
  できないです。設計上はともかくとして、実装は不要と思います。
4
49
 
5
50
  インターフェースは「変数やメソッドの定義忘れをコンパイラが解釈してエラー通知してくれる」という側面があると思いますが、JavaScriptではそのような実装はありません。