注: この理論は詳細すぎるため、変更はしません。ただし、複数のテストを行った結果、実際のコードと理論の間に矛盾は見つかりませんでした。間違いがあれば、誰かにアドバイスを求めてください。
関数
まず、関数オブジェクトの概念を確認してみましょう。関数を表すオブジェクトは関数オブジェクトです。すべての関数オブジェクトは Function オブジェクトから構築されます。言い換えれば、Function はトップレベルのコンストラクターです。ユーザー定義オブジェクト、システム組み込みオブジェクト、さらにはそれ自体を含む、システム内のすべてのオブジェクトを構築します。これは、Function がブートストラップ (自身を構築する機能) を備えていることも示しています。これは、Function の [[call]] と [[constructor]] が同じロジックを持つことも間接的に決定します。
function Foo() {}; >var foo = new Foo();
//Foo は foo
alert(foo instanceof Foo) のコンストラクターです // true
//しかし、関数は foo
alert のコンストラクターではありません。 (foo instanceof Function); // false
//関数は Foo のコンストラクターです
alert(Foo instanceof Function);//true
上記のコードは foo とそのコンストラクターを説明していますFoo Foo のコンストラクター Function との関係。 (具体的な原理については、Function と Object のメモリ関係図を参照してください)
Object
Object の場合、すべてのオブジェクトは Object のプロトタイプを継承しますが、これも明確に知っておく必要があります。そのオブジェクトは関数でもあるため、オブジェクトは関数によって構築されます。 (オブジェクトに関する理論はそれほど多くありません)
関数とオブジェクト
これがこの記事の焦点であり、非常に重要です。
alert(FunctioninstanceofFunction);// true
alert(Object のインスタンスの関数);//true
alert(Function のインスタンス);//true
function Foo() {};
var foo = new Foo(); >alert( fooinstanceofFoo); // true
alert(fooinstanceofFunction); //false
alert(FooinstanceofFunction);
alert(FooinstanceofObject); // true
これらの答えを理解できますか?おめでとうございます。JavaScript 言語の本質を理解できました。
それでは、オブジェクトと関数の実際の関係を見てみましょう:
図を見る前に、関数オブジェクトとインスタンスの原則に関する 2 つの記事を読んでください。そうしないと、メモリ図が表示されなくなります。理解するのが難しいでしょう。
ここで、メモリグラフについて説明したいと思います。関数オブジェクトの構築プロセスについては、関数オブジェクトの記事で説明しています。この記事では、関数がブートストラップされると述べられているため、関数オブジェクトの構築プロセスについて説明します。関数オブジェクト Foo についても同様です。したがって、強調表示する図では、構築プロセスが同じであることを示すために「|」を使用してそれらを区切っています。インスタンスオブとメモリマップの理論によれば、上記のステートメントは正しい結果を導き出すことができます。ここではそれらを一つ一つ説明しません。読者はそれらを自分で体験してください。
この複雑なメモリ図が理解できない場合は、次の図を見て理解するとよいでしょう:
注: コードの実際の実行フローは正確には異なります。この図のように、つまり、この図には何か問題があります (間違っていると言えます)。なぜ Functioninstanceof Function が true であるのかを説明できません。 ただし、関数とオブジェクトの関係を理解するのは簡単です。