17333


**newしなくても、関数はコンストラクタと呼ばれるのでしょうか？**  
・ 関数 ／ コンストラクタ は同じ意味？

**関数を定義しただけで、Functionオブジェクトになるのでしょうか？**  
・ 関数 ／ Functionオブジェクト は同じ意味？

[code]

       var Hoge = function(name) {
         this.name = name;
        };
    
[/code]

* * *

**補足追記**

・下記を読んで、関数定義した時点でconstructor
プロパティが生成されるのなら、newしなくても、関数はコンストラクタと呼ばれるのかと思ったのですが、そういうわけではないということでしょうか？  
・そもそも何を持ってコンストラクタとするかは解釈が分かれる？
のかも知れませんが、一般的には、コンストラクタは関数の内の一種で、関数定義しただけではコンストラクタとは呼ばない  
・constructor
プロパティを持つオブジェクトをコンストラクタと呼んでしまうと、コンストラクタからイメージする内容と乖離してしまう、ということでしょうか？  
・constructor プロパティと、コンストラクタは、意味が全く異なる？

> constructor プロパティが生成されるのは、Function オブジェクトが生成されたとき  
>  <http://d.hatena.ne.jp/teramako/20120927/p1>


CC BY-SA 3.0
2015-10-06T23:16:38.203
17326
2015-10-07T21:50:58.210
2015-10-07T21:50:58.210
7886
7886
question
javascript
JavaScriptでは、関数 ／ コンストラクタ ／ 関数オブジェクト ／ Functionオブジェクト は同じ意味でしょうか？


1点目についてですが、コンストラクタは関数の一種です。コンストラクタでない関数としては`alert()`のような組み込み関数があげられます。


CC BY-SA 3.0
2015-10-06T23:54:05.033
17328
2015-10-06T23:54:05.033
5750
17326
answer


**関数とコンストラクタ**

例えば、

[code]

    function add(v){
        return v + 4;
    }
    
[/code]

のような（引数に４プラスした値を返す）関数は、  
`new add(7);`  
のように呼び出しできますが、（そういう意味ではコンストラクタと言えても）  
一般には関数`add`のことをコンスタラクタとは言いません。

また、`Date`関数は  
`new Date()`, `Date()`  
どちらの形でも使用できますが、  
前者はインスタンスを返すのでコンストラクタ、後者は文字列を返すのでコンストラクタとは呼びません。  
（逆にnew しなくてもインスタンスを返すものはコンストラクタと呼んでもいいかもしれません）

質問にあるコードの`Hoge`に関して言えば、`new`
を付けずに呼び出された場合、`this`は、`window`を指し大域変数としての`name`に引数をセットします。  
このようなインスタンスを返さないようなものは（用法として）コンストラクタとは言えません。  
(newを付けて呼び出す場合はコンストラクタ）

**関数 と Functionオブジェクト**

関数定義は結局Functionオブジェクトを作ることなので、  
全ての関数はFunctionオブジェクトであるといっていいと思います。

（狭義には）Function コンストラクタで生成されたもの（`new Function (引数並び,
関数本体)`の形式、動作は一般定義の関数と異なる部分がある。）を Function オブジェクトとして区別する人もいるかもしれません。


CC BY-SA 3.0
2015-10-07T00:22:49.217
17329
2015-10-07T00:22:49.217
5044
17326
answer


先に後者から。

## 関数とFunctionオブジェクト

Javascript における全ての関数は Function オブジェクトで表されます。Function オブジェクトは `new Function()`
として生成するほかに、専用の構文である「function文」「function式」を使うこともできます。

  * [ECMA-262 §4.3.24 Terms and definitions > function](http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.24)
  * [ECMA-262 §13 Function Definition](http://www.ecma-international.org/ecma-262/5.1/#sec-13)

ネイティブ関数であっても、Function オブジェクトです。

[code]

    document.write(alert instanceof Function);
[/code]

## コンストラクタ

コンストラクタは関数（もとい Function オブジェクト）であるため、関数の一種と言えるでしょう。

Javascript における「コンストラクタ」の用法としてまっさきに浮かぶのは、`new`
を付けて関数を呼ぶことを「コンストラクタとして呼ぶ」と表現するといったものです。ここから考えると、ある関数がコンストラクタであるかというのは、その関数をコンストラクタとして（`new`を使って）呼ぶことができるかどうか、だと思います。

例えば Date オブジェクトについて、規格上は以下のような記述が見られます。

> When `Date` is called as part of a `new` expression, it is a constructor: it
> initialises the newly created object.  
>  \--- <http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3> より引用

このように、 `new` を付けて（コンストラクタとして）呼び出される前提のもとで、ある関数のことを「コンストラクタ」と呼ぶのだと思います。

また `Array()` のように `new` を使わなくても同じように機能するオブジェクトについてですが、

> When Array is called as a function rather than as a constructor, it creates
> and initialises a new Array object. Thus the function call Array(…) is
> equivalent to the object creation expression new Array(…) with the same
> arguments.  
>  \--- <http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.1> より引用

といった書き方になっているので、厳密に言えば「コンストラクタではないが、コンストラクタのようにオブジェクトを生成する関数」というところかと思います。クラスベースの言語で
`new Hoge()` を内部的に呼び出す静的メソッド `Hoge.create()` が存在したとしても、それをコンストラクタと呼ばないのと同じように。


CC BY-SA 3.0
2015-10-07T02:32:18.323
17333
2015-10-07T02:32:18.323
8000
17326
answer


newしなくても、関数はコンストラクタと呼ばれるのでしょうか？  
・ 関数 ／ コンストラクタ は同じ意味？

いいえ。コンストラクタは関数の一種です。コンストラクタ=関数は成立しますが、関数=コンストラクタは成立しません。  
ではコンストラクタとはどういう関数かというと、  
「オブジェクトを初期化して返す関数」全般を「コンストラクタ」とするのならばそういう振る舞いをする関数は全部コンストラクタでしょうが、  
Javascriptでのコンストラクタ、と限定するのであればオブジェクトのconstructorプロパティに設定されている関数のことです。  
ある関数をnewキーワードをつけて呼び出した場合、その関数内でthisで参照可能なオブジェクトのconstructorプロパティはその関数を指します(Javascriptにより自動で設定されます)。つまり明示的に別のオブジェクトをreturnしたり、constructorプロパティを書き換えない場合は、newして作成されたオブジェクトのconstructorプロパティはnewで呼び出した関数となり、  
つまりその関数のことをコンストラクタと呼びます。  
Javascriptはこの辺プロトタイプチェインとか絡んできてややこしいです。この世からなくなればいいのに。

関数を定義しただけで、Functionオブジェクトになるのでしょうか？  
・ 関数 ／ Functionオブジェクト は同じ意味？

はい。


CC BY-SA 3.0
2015-10-07T02:51:43.607
17334
2015-10-07T02:51:43.607
12617
17326
answer


同じ意味か？と言われれば言葉に内包している意味合いは違います。  
ですが、同じ動きか？と聞かれれば概ね同じ動きだと思います、  
順番に説明します。

**※関数について**  
関数については特筆ありません。  
`function(){}`で宣言された処理の集まりです。  
上記、無名関数ですが大体は`function foo(){}`と名前を付けることが多いかと思います。

**※コンストラクタについて**  
`var cnst = new foo();`  
上記のように`new`を頭に付けて宣言する関数をコンストラクタと言います。  
「結局、中身はおんなじなんじゃねーの？」とも思いますが、微妙に異なります。

[code]

    function foo(){
        this = {}//暗黙的追加
        return this;//暗黙的追加
    }
    
[/code]

関数の始めにオブジェクトを作成して終わりに返却しています。  
「何の役に立つんだよ」ってことですが……

[code]

    function cnst_test(){
      this.n=0;
      this.counter=function(){this.n++;alert(this.n);}
    }
    
    var test = new cnst_test();
[/code]

[code]

    <button onclick="test.counter()">Click</button>
[/code]

こんなことが出来ます。  
JavaScriptにはクラスはありませんが、クラスっぽいです。  
「これだけなら暗黙的にしなくても明示的に出来るんじゃ……」  
はい、できます。ただしプロトタイプ宣言の紐付けが無くなってしまいます。

**※関数オブジェクト／Functionオブジェクトについて**  
なんとなくここまでみて関数はオブジェクトみたいだなと感じられたかと思いますが、  
その通りです。FunctionクラスのオブジェクトがJavaScriptでの関数の扱いになっています。  
ですので、JavaScriptで作られる関数は全て関数オブジェクトです。  
Functionオブジェクトは

> **function** foo(){}  
>  ↑これ

のことなので、[ここ](https://msdn.microsoft.com/ja-
jp/library/x844tc74\(v=vs.94\).aspx)に書いてあることが全てですかね……


CC BY-SA 3.0
2015-10-07T04:10:15.083
17335
2015-10-07T04:10:15.083
7676
17326
answer