質問: 下記違いは何でしょうか? ``` Object.create(Object.prototype); Object.create({}); ``` ・上 ... null をプロトタイプとするオブジェクト ・下 ... 上 をプロトタイプとするオブジェクト? ・それぞれメリットデメリットがあれば知りたいです
回答: どちらも実質的には同じですので、メリットデメリットといったものはありません。 厳密には、下の`Object.create({});`は以下のコードと等価です。 ``` Object.create(Object.create(Object.prototype)); ``` 内部的にはプロトタイプチェーンの階層が異なります。 つまり、`Object.create(Object.prototype);`は直接の`prototype`が`Object.prototype`であるオブジェクトを生成しますが、`Object.create({});`の場合は直接の`prototype`は`{}`によって生成されたオブジェクトになります。その`{}`によって生成されたオブジェクトの`prototype`は`Object.prototype`です。 ``` a = {}; b = Object.create(Object.prototype); a.isPrototypeOf(b); // false Object.prototype.isPrototypeOf(b); // true b = Object.create(a); a.isPrototypeOf(b); // true Object.prototype.isPrototypeOf(b); // true ```