Понимание прототипа, созданного из «нового» экземпляра

В документах MDN new говорится:

The new keyword does the following things:

  1. Creates a blank, plain JavaScript object.
  2. Adds a property to the new object (__proto__) that links to the constructor function's prototype object

Как именно тогда определяется прототип? Я думал, что это будет:

  • Если он находится в функции (без использования ключевого слова class), он будет искать, есть ли где-то объявленный [Constructor].prototype, и использовать его, а если нет, он вернется к... (не уверен?). Например, если конструктор называется Range, он будет искать, определен ли Range.prototype, и использовать его в качестве прототипа.
  • Если он находится в class, то он будет использовать каждый метод или свойство для создания прототипа.

Это более или менее правильное понимание, или что я мог упустить?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Независимо от того, объявлен ли конструктор с синтаксисом класса или как function, объект <constructor.prototype> всегда будет существовать, даже если он никогда не упоминается явно. Пример:

function FooFn() {}
class FooClass{}

console.log(FooFn.prototype);
console.log(FooClass.prototype);

Эти объекты .prototype представляют собой простые объекты, которые становятся внутренним прототипом экземпляров, созданных с помощью new. У них также есть свойство .constructor, указывающее на конструктор (функция/класс, используемый для создания экземпляра).

Так что это не совсем то

it would lookup to find if there is a [Constructor].prototype declared somewhere and use that

а скорее то, что такое свойство всегда существует в функциях и классах, и когда экземпляр создается с помощью new, объект внутри свойства .prototype становится внутренним прототипом экземпляра.

If it's in a class then it would use every method or property to build the prototype up.

Не совсем так — класс — это просто синтаксический сахар для функции. Что это делает:

class Foo {
  method() {
    console.log();
  }
}

почти точно (но не полностью) совпадает с

function Foo() {}
Foo.prototype = function method() {
  console.log();
}

Методы назначаются объекту .prototype класса, когда происходит объявление класса, а не при создании экземпляра.

class X {
  xMethod() {
  }
}

console.log(X.prototype);
console.log(X.prototype.hasOwnProperty('xMethod'));
console.log(X.prototype === (new X).__proto__);

Другие вопросы по теме