Понимание прототипного наследования

var Object1 = {};
var Object2 = new Object();
var Object3 = Object.create({});

Когда я проверяю, равен ли прототип Object.prototype:

Первые два возвращение true в то время как третий возвращается false,

Почему это происходит?

Object.getPrototypeOf(Object1)===Object.prototype //true
Object.getPrototypeOf(Object2)===Object.prototype //true
Object.getPrototypeOf(Object3)===Object.prototype //false

2 ответа

Решение

Просто потому, что если вы посмотрите на Object.create() в документации, вы увидите, что этот метод:

создает новый объект с указанным объектом-прототипом и свойствами.

И если вы называете это с:

Object.create({})

Вы передаете не прототип, а пустой объект без свойств.

Итак, как указано в комментариях, вы должны назвать это так:

Object.create(Object.prototype)

Метод Object.create() создает новый объект с указанным объектом-прототипом и свойствами.

За кулисами он делает следующее:

Object.create = (function() {
  var Temp = function() {};
  return function (prototype) {
    if (arguments.length > 1) {
      throw Error('Second argument not supported');
    }
    if (typeof prototype != 'object') {
      throw TypeError('Argument must be an object');
    }
    Temp.prototype = prototype;
    var result = new Temp();
    Temp.prototype = null;
    return result;
  };
})();

Таким образом, правильное использование будет:

var Object3 = Object.create(Object.prototype);

Или, если вы хотите, чтобы ваш пример работал:

Object.getPrototypeOf(Object.getPrototypeOf(Object3)) === Object.prototype // true 

Здесь вступает в действие цепочка прототипов:

console.dir(Object3)
 -> __proto__: Object (=== Your Object Literal)
   -> __proto__: Object (=== Object.prototype)
Другие вопросы по тегам