Подтвердить что ты не робот

Почему Object.create() и новый Object() оценивают разные прототипы?

Почему эти 2 реализации ведут себя по-другому? Что именно их отличает, когда дело доходит до оценки их прототипов?

Создание объекта с указанным прототипом:

   function Foo() {}

   // creates an object with a specified prototype
   var bar = Object.create(Foo);

   console.log(Object.getPrototypeOf(bar)); // returns: function Foo(){}
   console.log(Foo.isPrototypeOf(bar)); // returns: true

Создание объекта с помощью метода конструктора:

   function Foo() {}

   // creates an object with the constructor method    
   var bar = new Foo();

   console.log(Object.getPrototypeOf(bar)); // returns: Foo {}
   console.log(Foo.isPrototypeOf(bar)); // returns: false

Кроме того, почему вторая реализация возвращает как Foo {}, так и false?

4b9b3361

Ответ 1

Object.create(Foo) означает "создать объект с Foo в качестве прототипа".

new Foo() означает "Создать объект с Foo.prototype в качестве прототипа и Foo в качестве конструктора".

Следовательно, Foo является прототипом Bar в первом примере и конструктором Bar во втором примере.

Я думаю, что вторая часть вашего вопроса вызвана ошибочным выпуском консоли - Object.getPrototypeOf(bar) фактически возвращает Foo.prototype, а не Foo:

function Foo() {}
var bar = new Foo();

Object.getPrototypeOf(bar) === Foo
// -> false

Object.getPrototypeOf(bar) === Foo.prototype
// -> true

Ответ 2

Когда вы используете ключевое слово 'new' для создания объекта, который JavaScript фактически добавляет в две строки кода к вашему объекту.

Если вы собираетесь создать объект с псевдоклассическим экземпляром, вы создадите свой объект следующим образом:

var Foo = function() {
this.property = 'baz';
};

Когда вы вызываете var bar = new Foo() Javascript запускает Foo следующим образом:

var Foo = function() {
// ADDED CODE: var this = Object.create(Foo.prototype);
this.property = 'baz';
// ADDED CODE: return this;

Использование Object.create создает отношения делегирования от вновь созданного объекта к указанному объекту, поэтому в вашем первом случае панель делегирует свои поисковые запросы в Foo, но во втором случае запросы перенаправляются в Foo.prototype.

Вы можете найти этот комментарий в блоге. Он переходит в псевдоклассическое создание экземпляра (с использованием нового ключевого слова) в отличие от прототипального экземпляра, который не использует новое ключевое слово.