あなたの「はじめに...」に答えるために、あなたはまだJavascript環境に出くわすかもしれません
console.log(typeof Object.create);
報告します
undefined
またはそのようなもの(ログ機能を使用できるコンソールオブジェクトさえあると仮定します。)その外側のif (typeof Object.create !== 'function')
ラッパーの理由は、JS環境がまだそうしていない場合にのみこれを定義するためです。Object.create
おそらく定義されていない可能性のあるコードがいつか実行される可能性のある古いブラウザーやその他の環境が多数あります。
この実際の関数がどのように機能するかについては、JS がオブジェクトを処理する方法に基づいています。オブジェクトは、単に名前付きプロパティのコレクション、またはより正確には文字列名とプロパティ値の間の関連付けです。しかし、多くは特別なプロパティを持っていますprototype
。これは、別のオブジェクトへの単なるポインタです。そのオブジェクトは、独自のprototype
オブジェクトを持つこともできます。prototype
ただし、最終的には、これらのオブジェクトのいずれかの が null になると、プロトタイプ チェーンが消滅します。これらのプロトタイプ オブジェクトは、名前付きプロパティのコレクションでもあります。Javascript エンジンが名前付きプロパティをオブジェクトで検索しているときに、オブジェクトで直接見つからない場合は、オブジェクトのプロトタイプに含まれている可能性があるかどうかを確認します。そのオブジェクトのプロトタイプにそれが含まれる可能性がある場合は、そうではなく、チェーンがなくなるまで続きます。
これらのプロトタイプ オブジェクトのポイントは、共有できることです。いくつかのオブジェクト、または数百万のオブジェクトでさえ、1 つのプロトタイプを共有できます。これは、クラスベースの継承スキームの動作とは大きく異なりますが、多くの場合、同様の目的に使用できます。関数の単一のコピーを定義でき、共通のコンストラクター関数から作成されたすべてのオブジェクトがその 1 つのコピーを使用します。このような手法Object.create
が作成される前は、これが Javascript でオブジェクト指向プログラミングを行う唯一の現実的な手段でした。
Crockford のコードは、その古い手法を使用して、新しい手法が行うべきことの一部をシミュレートしています。 Object.create
古いメカニズムでは実際には達成できないいくつかの動作を定義しますが、最も基本的な動作は、プロトタイプが指定されたオブジェクトである新しいオブジェクトを作成することです。それはまさに、使用してF.prototype = o; return new F();
達成された古い技術です。したがって、このコードは、新しい動作を古い環境に組み込む標準的な方法です。この別の例については、MDN 作成ページを参照してください。