JavaScriptでは、関数 ／ コンストラクタ ／ 関数オブジェクト ／ Functionオブジェクト は同じ意味でしょうか？


**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>




先に後者から。

## 関数と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()` が存在したとしても、それをコンストラクタと呼ばないのと同じように。




先に後者から。

## 関数と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()` が存在したとしても、それをコンストラクタと呼ばないのと同じように。

