回答編集履歴
1
関数とコンストラクタ
answer
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
### 関数呼び出し
|
2
|
+
|
1
3
|
> ```JavaScript
|
2
4
|
> console.log(Boolean("string")); //=> true
|
3
5
|
> ```
|
@@ -5,4 +7,31 @@
|
|
5
7
|
いずれも「コンストラクタ呼び出し」はされていません。
|
6
8
|
「関数呼び出し」です。
|
7
9
|
|
10
|
+
### 関数はコンストラクタの性質を併せ持つ
|
11
|
+
|
12
|
+
関数定義の仕方によって違いはありますが、全ての関数はコンストラクタでもあるのが原則です。
|
13
|
+
コンストラクタ呼び出しできるなら、コンストラクタといえますし、関数呼び出しできるなら、関数といえます。
|
14
|
+
`Boolean()` は両方の性質を持ちます。
|
15
|
+
|
16
|
+
```JavaScript
|
17
|
+
new Boolean; // コンストラクタ呼び出し
|
18
|
+
Boolean(); // 関数呼び出し
|
19
|
+
```
|
20
|
+
|
21
|
+
### 関数またはコンストラクタの性質を持つ場合
|
22
|
+
|
23
|
+
例外として、一部のビルトイン関数はいずれか一つの呼び出しのみを許可しています。
|
24
|
+
|
25
|
+
```JavaScript
|
26
|
+
Map(); // TypeError: Constructor Map requires 'new'
|
27
|
+
new parseInt; // TypeError: parseInt is not a constructor
|
28
|
+
```
|
29
|
+
|
30
|
+
ユーザ定義としては、アロー関数やclass構文も例外に入ります。
|
31
|
+
|
32
|
+
```JavaScript
|
33
|
+
new (()=>{}); // TypeError: (intermediate value) is not a constructor
|
34
|
+
(class {})(); // TypeError: Class constructors cannot be invoked without 'new'
|
35
|
+
```
|
36
|
+
|
8
37
|
Re: ohs6261 さん
|