@Torento20345

Как происходит прототипированное наследование в js?

Когда мы создаем переменную
var x = 'hello world';
Интерпретатор js на уроне Си подбирает ей тип данных и прогонят после что-то типа такого?
var x = new String(x);
Где в объекте String есть объект prototype и передает переменной все его методы и свойства?
И когда мы меняем в String.prototype что-то, получается мы меняем объект конструктора, который отвечает за тот или иной тип?
И откуда берутся String изначально в window?
  • Вопрос задан
  • 48 просмотров
Пригласить эксперта
Ответы на вопрос 1
@vshvydky
прототипы жс достаточно простая и последовательная штука.
если сравнивать с ооп, то в ооп есть класс, в нем есть конструктор, приватные и публичные методы. (остальное опустим)
. Так вот когда в js выполняется new SomeClass(...data) по сути инициализируется объект (экземпляр соответствующего класса)
Описание в прототипном стиле простое, функция с именем класса исполняет роль конструктора класса. Оперирование внутри этой функции к this.anyKey отсылка к свойствам и методам.
Объявление методов вне конструктора происходит через SomeClass.prototype.someMethod = ,,,,
При создании экземпляра по сути создается обычный плейн объект с его внутренним состоянием
Чтобы было чуть проще создаем пример const some = new SomeObject()
Все динамическое, что может создать конструктор можно воспринимать как контекст плейн объекта
Все методы, которые были объявлены в прототипе будут переданы ссылками в свойство __proto__
Итогом такой операции будет следующее верное условие
some.__proto__.methodName === SomeClass.prototype.methodName.
Исходя из принципа работы контекста, любая функция (метод) вызванная в контексте того или иного объекта будет знать его динамические значения( имею ввиду значения, заданные в конструкторе, или просчитанные в рантайм).
по теме String в window в js любая функция должна быть где-то. Глобальный объект в браузере это Window, в Node.js это global. Все что ты вызываешь без импорта доступно именно из глобального объекта. Из неоткуда в js не берется ничего.
Исключением можно считать некоторые переменные в Node.js такие как __dirname, __filename, exports  и тп, они по сути переменные функции враппера, которая оборачивает любой импортируемый код, подробнее в доке по ноде об этом расписано.
>>>И когда мы меняем в String.prototype что-то, получается мы меняем объект конструктора, который отвечает за тот или иной тип? ---- если ты добавляешь новый метод, ты считай расширяешь класс стринг, если заменяешь уже существующий метод на свой ты его переопределяешь. Но по сути такой механизм является мутацией существующего класса и его нельзя считать наследованием в таком виде. Хотя и наследование в прототипном стиле сделать можно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы