回答編集履歴

3

JavaScriptにての、列挙型の実装例を挙げた

2020/02/26 04:14

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -36,6 +36,148 @@
36
36
 
37
37
 
38
38
 
39
+ また、下記に、JavaScriptにての、列挙型の実装例を記載いたしますので、
40
+
41
+ 参考にしてください。
42
+
43
+
44
+
45
+ ```javascript
46
+
47
+ const EnumCaseStruct = (() => {
48
+
49
+ const key = Symbol();
50
+
51
+
52
+
53
+ return class EnumCaseStruct {
54
+
55
+ constructor(val) {
56
+
57
+ this[key] = val;
58
+
59
+ }
60
+
61
+ // Swiftを参考に、rawValueで、値を取得できるようにしている
62
+
63
+ get rawValue() {
64
+
65
+ return this[key];
66
+
67
+ }
68
+
69
+ };
70
+
71
+ })();
72
+
73
+
74
+
75
+ class Enum {
76
+
77
+ constructor(...cases) {
78
+
79
+ if (!cases.every(v => {
80
+
81
+ switch (typeof v) {
82
+
83
+ case 'object':
84
+
85
+ // オブジェクトの場合、各キー値にて、上のクラスのインスタンスとして定義
86
+
87
+ Object.keys(v).forEach(ve => {
88
+
89
+ Object.defineProperty(this, ve, {value: new EnumCaseStruct(v[ve])});
90
+
91
+ });
92
+
93
+ return true;
94
+
95
+ case 'string':
96
+
97
+ // 文字列型なら、そのまま初期化する
98
+
99
+ Object.defineProperty(this, v, {value: new EnumCaseStruct(v)});
100
+
101
+ return true;
102
+
103
+ defalult:
104
+
105
+ // オブジェクトか、文字列型以外は受け付けないようにする
106
+
107
+ return false;
108
+
109
+ }
110
+
111
+ })) {
112
+
113
+ // オブジェクトか文字列以外は、エラーをスローする
114
+
115
+ throw new Error('Type error!');
116
+
117
+ }
118
+
119
+ }
120
+
121
+ }
122
+
123
+
124
+
125
+ // 使い方
126
+
127
+ const fruits = new Enum(
128
+
129
+ {apple: 25},
130
+
131
+ {melon: 125}
132
+
133
+ );
134
+
135
+
136
+
137
+ const apple01 = fruits.apple;
138
+
139
+ const apple02 = fruits.apple;
140
+
141
+ console.log(apple01 == apple02); // true
142
+
143
+
144
+
145
+ // 可変長引数のため、下記のようにも定義可能
146
+
147
+ const fruits02 = new Enum(
148
+
149
+ {
150
+
151
+ apple: 25,
152
+
153
+ melon: 125
154
+
155
+ },
156
+
157
+ 'pine'
158
+
159
+ );
160
+
161
+ // 各列挙型は各値が一意となるため、比較時は偽となる。
162
+
163
+ console.log(fruits.apple == fruits02.apple); // false
164
+
165
+ // Swiftを参考に、rawValueにて、設定した値を返す
166
+
167
+ console.log(fruits.apple.rawValue); // 25
168
+
169
+ // 文字列をそのまま入れた場合は、rawValueはその文字列を返す
170
+
171
+ console.log(fruits.pine.rawValue); // pine
172
+
173
+ ```
174
+
175
+
176
+
177
+ 一例なので、もっといい、もっと列挙型っぽい定義はできるかと思います。
178
+
179
+
180
+
39
181
  大雑把な概念などの話で恐縮ですが、以上になります。
40
182
 
41
183
  開発のヒントになれば幸いです。

2

メソッドではなかったので、修正

2020/02/26 04:14

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  - constructor.nameないし、instanceofキーワードを使い、クラスを特定
34
34
 
35
- JavaScriptにおいて、そのインスタンスが、どのクラスで初期化されたかどうかは、上記のメソッド、キーワードを使えば確かめることができるので、その情報を使い、処理を分けるという方法もあります。
35
+ JavaScriptにおいて、そのインスタンスが、どのクラスで初期化されたかどうかは、上記のプロパティ、キーワードを使えば確かめることができるので、その情報を使い、処理を分けるという方法もあります。
36
36
 
37
37
 
38
38
 

1

質問の状況を見て修正と、クラス名の特定の方法を提案

2020/02/25 04:27

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -11,6 +11,10 @@
11
11
  もしくは、Playerクラスに、roleメンバを用意し、Roleクラスを別で用意し、各ロールを、Roleクラスをオーバーライドしたクラスとし、Playerの初期化時に、指定されたロールのクラスのインスタンスを、roleメンバに代入(初期化)するとかですね。
12
12
 
13
13
  これで一元管理しつつ、各ロール別の特性の定義もしやすくなるでしょう。
14
+
15
+
16
+
17
+ と、既にそのような実装をしていたようなので、下記の実装の仕方で、大方解決できるかと。
14
18
 
15
19
  - 上記を踏まえ列挙型の定義をする
16
20
 
@@ -26,6 +30,10 @@
26
30
 
27
31
  むしろ、列挙型を使わなくても、TypeScriptの方が、ゲーム開発ならばかなり優位になるかと思います。
28
32
 
33
+ - constructor.nameないし、instanceofキーワードを使い、クラスを特定
34
+
35
+ JavaScriptにおいて、そのインスタンスが、どのクラスで初期化されたかどうかは、上記のメソッド、キーワードを使えば確かめることができるので、その情報を使い、処理を分けるという方法もあります。
36
+
29
37
 
30
38
 
31
39
  大雑把な概念などの話で恐縮ですが、以上になります。