質問: こんにちは。 JavaScriptの参考サイトリンク内容の以下の画像の以下の部分で、*1から*2が言える、ということが理解できないのです。 ↓ ・ObjectとFunctionはいずれも*proto*プロパティがFunction.prototypeを参照している*1 ・これはつまり、ObjectはFunctionから生成され、FunctionはFunction自身から生成されているといえる*2 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/ae0a00560d436cb94e16880a75769da3.png) よろしくお願い致します。
回答: ### コードで理解する > > - ObjectとFunctionはいずれもprotoプロパティがFunction.prototypeを参照している*1 > > - これはつまり、ObjectはFunctionから生成され、FunctionはFunction自身から生成されているといえる*2 > > > 言葉上の定義にとらわれず、コードを書いて検証する事をお勧めします。 忌憚なき意見を述べるなら、多くの個人サイトで、著者自身の用語解釈に誤りがあると私は感じています。 ``` console.log(Function.__proto__ === Function.prototype); // true console.log(Object.__proto__ === Function.prototype); // true ``` ### プロトタイプチェーンに関するよくある誤解 プロトタイプチェーンは new 演算子とセットで説明される事が多いようです。 ``` function Foo () {} const f = new Foo; console.log(f.__proto__ === Foo.prototype); // true ``` 多くのサイトでは、上記のようなコードを使って説明されます。 そこから、 * `__proto__` は new 演算子で**生成した**コンストラクタの prototype プロパティを指すものである という**誤解**が生まれます。 著者(@maeharin)も同様の誤解をしている為に、「や...やっと理解できた!JavaScriptのプロトタイプチェーン - maeharinの日記」では、 > > ・これはつまり、ObjectはFunctionから生成され、FunctionはFunction自身から生成されているといえる > > > と結論しています。 実際には、プロトタイプチェーンは、「new演算子で生成したから発生する」のではありません。 プロトタイプチェーンは、**プロパティ参照時に必ず発生する**のです。 つまり、 ``` object.prop object['prop'] ``` 上記コードではプロトタイプチェーンが発生しています。例外はありません。 Re: slimat さん