むしろfunction() {}
と書くとnew Function()
として解釈されると思っていいでしょう。
Function の中身については、多くは JavaScript ではありません。
各 JS 実装系のネイティブコード (例えば Chrome の JS 実行環境 "V8" なら、C++) で書かれています。
そして JavaScript (ECMAScript) の仕様として、 Function のインスタンスは「関数」であり、() を付けることでその処理内容を実行することが取り決められています。
つまり特別扱いです。Function のインスタンスは本来、現在の JavaScript では実装できない機能を持っています。
他に Array のインスタンスも、arr[1] = "foo";
とするだけでlength
プロパティが変化するなど、現在のJavaScript
では実装できません。
Functionクラスもオブジェクトということは、その上にクラスをまとめるもののようなものがるのですか?
JavaScript で一般にクラスと呼ばれているものは、厳密には「コンストラクター関数」です。
つまりFunction
自体も関数であり、Function instanceof Function
はtrue
になります。
そして、あらゆるクラスをまとめるものという意味では、JavaScript にはすべてのオブジェクトの基底クラスとなる Object
が存在します。
Function instanceof Function
はtrue
ですし、Function instanceof Object
もtrue
です。
継承関係にあるといえます。
<あらゆるオブジェクト> instanceof Object
はほとんどすべてのケースでtrue
となります。
ただし、ややこしくなりますが、JavaScript にはオブジェクトと呼ばれるものが2種類存在します。
それは、Object
とobject
です。
前者はいわゆるクラス。コンストラクター関数の名前です。
後者は値の型です。JavaScript では、値の型とクラスは分けて考えます。
(ここでも特別扱いが存在するのでややこしいのですが、) Function インスタンス以外のオブジェクトの型は、基本的にすべてobject
です。(Function のみfunction
型が用意されています。)
typeof {}
: "object"
(new Object() と同じため)
typeof []
: "object"
(new Array() と同じため)
typeof /foo/
: "object"
(new RegExp("foo") と同じため)
typeof new String("foo")
: "object"
(typeof "foo" とは違います)
typeof function(){}
: "function"
(new Function() と同じにもかかわらず、特別扱い)
function
はobject
ではありません。型には継承関係は存在しないのです。
そして、最後のややこしさ。
<あらゆるオブジェクト> instanceof Object
はほとんどすべてのケースでtrue
となります。
の、「ほとんどすべて」に該当しないケースの話です。
var obj = Object.create(null);
とした時、
typeof obj
: object
なのに、
obj instanceof Object
: false
になります。
object
型なのに、Object
クラスのインスタンスではないのです。
この辺の意味まではまだ…、存在するという紹介にとどめておきます。
object かつ Object である {}``new Array()
など
object だが Object ではない Object.create(null)
実はnull
自体も何故かここ
object ではないが Object である function(){}``new Function()
object でも Object でもない 3.14``true``"foo"
など。スカラー型
ということで、まじめに考えるとちょっとややこしい JavaScript のクラスと型まわりの話です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/29 06:43
2015/10/29 13:38