Object.create(Object.prototype);とObject.create({});の違い


下記違いは何でしょうか？

[code]

    Object.create(Object.prototype);
    
    Object.create({});
    
[/code]

・上 … null をプロトタイプとするオブジェクト  
・下 … 上 をプロトタイプとするオブジェクト？

・それぞれメリットデメリットがあれば知りたいです




どちらも実質的には同じですので、メリットデメリットといったものはありません。

厳密には、下の`Object.create({});`は以下のコードと等価です。

[code]

    Object.create(Object.create(Object.prototype));
    
[/code]

内部的にはプロトタイプチェーンの階層が異なります。

つまり、`Object.create(Object.prototype);`は直接の`prototype`が`Object.prototype`であるオブジェクトを生成しますが、`Object.create({});`の場合は直接の`prototype`は`{}`によって生成されたオブジェクトになります。その`{}`によって生成されたオブジェクトの`prototype`は`Object.prototype`です。

[code]

    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
    
[/code]




どちらも実質的には同じですので、メリットデメリットといったものはありません。

厳密には、下の`Object.create({});`は以下のコードと等価です。

[code]

    Object.create(Object.create(Object.prototype));
    
[/code]

内部的にはプロトタイプチェーンの階層が異なります。

つまり、`Object.create(Object.prototype);`は直接の`prototype`が`Object.prototype`であるオブジェクトを生成しますが、`Object.create({});`の場合は直接の`prototype`は`{}`によって生成されたオブジェクトになります。その`{}`によって生成されたオブジェクトの`prototype`は`Object.prototype`です。

[code]

    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
    
[/code]

