Прототипы, наследование Flashcards
Что такое скрытое свойство [[Prototype]] у объектов?
Скрытое свойство [[Prototype]] у объектов - это ссылка на другой объект, который является прототипом, откуда объект наследует свойства и методы.
Как называется процесс, когда JS ищет свойство в объекте и его прототипах?
Это называется прототипное наследование.
Как задать прототип объекту через свойство __proto__?
Можно задать прототип объекту через свойство __proto__, например, obj.__proto__ = prototype, где obj - объект, а prototype - прототип.
Можно ли задать цепочку прототипов для объектов? Если да, то есть ли какие-либо ограничения?
Да, можно задать цепочку прототипов. Однако, ссылки не могут идти по кругу, и значение .__proto__ может быть только объектом или null. Также объект может наследоваться только от одного объекта (один [[Prototype]]).
Что такое __proto__ и как он связан с [[Prototype]]?
__proto__ является геттером/сеттером по отношению к [[Prototype]], но они не являются одним и тем же. __proto__ устарело и рекомендуется использовать методы Object.getPrototypeOf и Object.setPrototypeOf для чтения и записи значения [[Prototype]] соответственно.
Можно ли использовать прототип при записи/удалении свойств объекта?
Нет, прототип используется только для чтения свойств. Операции записи/удаления работают напрямую с объектом.
Как свойство-аксессор обрабатывает операцию записи?
Свойство-аксессор – исключение, так как запись в него обрабатывается сеттером.
Какое значение имеет ключевое слово “this” при вызове метода в JavaScript?
При вызове метода this - всегда объект перед точкой, независимо от того, где находится метод: в объекте или его прототипе.
Что проходит цикл for..in при переборе свойств объекта?
Цикл for..in проходит как по собственным, так и по унаследованным свойствам объекта.
Как получить только собственные ключи объекта?
Можно воспользоваться методом Object.keys(obj), который возвращает только собственные ключи объекта.
Как отфильтровать собственные и унаследованные свойства объекта?
Можно воспользоваться методом obj.hasOwnProperty(key), который возвращает true, если key является собственным свойством obj, и false, если свойство унаследовано.
Почему в цикле for..in не проходят свойства из Object.prototype?
Все свойства в Object.prototype имеют флаг enumerable, установленный в false, что делает их неперечисляемыми.
Какой эффект имеет установка F.prototype на объект, созданный с помощью new F()?
Установка F.prototype на объект, созданный с помощью new F(), делает объект, на котором вызывается new F(), наследником объекта, который был установлен в F.prototype в момент вызова конструктора F.
Можно ли изменить F.prototype после создания объектов с помощью new F()?
Да. Однако изменение F.prototype не повлияет на уже созданные объекты, они будут продолжать ссылаться на старый объект в качестве [[Prototype]].
Какие свойства есть у свойства по умолчанию в объекте prototype у функций-конструкторов?
У свойства prototype по умолчанию у функций-конструкторов есть единственное свойство constructor, которое ссылается на саму функцию-конструктор.
Что произойдет, если изменить свойство prototype функции-конструктора?
Если свойство prototype функции-конструктора будет изменено, то свойство constructor может быть потеряно у объектов, созданных с помощью new.
Как избежать потери свойства constructor при изменении свойства prototype функции-конструктора?
Чтобы избежать потери свойства constructor при изменении свойства prototype функции-конструктора, его можно заново создать или не перезаписывать prototype полностью, а добавлять к нему свойства по одному.
Какие методы доступны у нового объекта, созданного с помощью new Object() или литерала {}?
У нового объекта есть доступ ко всем методам объектов, которые берутся из Object.prototype.
Как связан объект с его прототипом?
При создании нового объекта его [[Prototype]] ссылается на прототип, указанный в конструкторе, или на Object.prototype для литералов.
Какое значение имеет свойство __proto__ у объекта Object.prototype?
У Object.prototype свойство __proto__ имеет значение null, так как он не имеет своего прототипа.
Какие объекты хранят свои методы в прототипах?
Объекты, такие как Array, Date, Function и другие, хранят свои методы в прототипах.
Что становится прототипом при создании массива?
При создании массива, его прототипом становится Array.prototype.
Какой объект находится выше всех в иерархии встроенных прототипов?
В иерархии встроенных прототипов выше всех находится Object.prototype.
Почему говорят, что все наследуется от объектов?
Говорят, что все наследуется от объектов, потому что Object.prototype является самым верхним объектом в иерархии встроенных прототипов, а все другие объекты наследуют его свойства и методы.
Как JavaScript находит нужный метод, если у нескольких прототипов есть методы с одинаковым именем?
JavaScript ищет метод снизу вверх, начиная с прототипа объекта, и использует первый найденный метод с указанным именем.
Где находятся методы для примитивов в JavaScript?
Методы для примитивов в JavaScript находятся в прототипах соответствующих объектов-обёрток: String.prototype, Number.prototype и Boolean.prototype.
Есть ли у значения null и undefined методы, свойства и прототипы?
Нет, значения null и undefined не имеют объектов-обёрток и, следовательно, не имеют методов, свойств и прототипов.
Какую рекомендацию дают по изменению встроенных прототипов?
Не рекомендуется изменять встроенные прототипы для своих нужд.
Что такое полифилы?
Полифилы - это эмуляция метода, который существует в спецификации JavaScript, но еще не поддерживается текущим движком JavaScript.
Зачем используют возможность изменения встроенных прототипов?
Возможность изменения встроенных прототипов используется для создания полифилов - эмуляции методов, которые еще не поддерживаются текущим движком JavaScript.
Что такое заимствование у прототипов?
Когда берем метод из одного объекта и копируем в другой.
Приведите пример заимствования у прототипа.
Например, создаем объект obj, похожий на массив (псевдомассив), у которого есть индексы и length. Понадобился метод из Array.
obj.join = Array.prototype.join; // теперь метод работает для объекта obj, так как для join важно только наличие индексов и свойства length
Можно ли унаследовать методы объекта, если объект уже наследует от другого объекта?
Это будет невозможно, так как объект может наследовать только от одного объекта одновременно.
Как можно сделать доступными методы массива для нашего объекта obj с помощью наследования?
Можно унаследовать от массива, установив obj.__proto__ равным Array.prototype. Однако, если obj уже наследует от другого объекта, это будет невозможно – может наследовать только от одного объекта одновременно.
Какие методы нужно использовать вместо свойства __proto__ для работы с прототипами объектов?
Нужно использовать методы Object.create, Object.getPrototypeOf и Object.setPrototypeOf.
Можно ли установить прототип объекта на пустой объект? Если да, то каким методом?
Да, можно. Прототип объекта можно установить на пустой объект с помощью метода Object.setPrototypeOf(obj, {}).
Что такое “продвинутое” клонирование объекта?
“Продвинутое” клонирование объекта - это создание точной копии объекта с помощью метода Object.create с использованием Object.getOwnPropertyDescriptors для клонирования всех свойств, включая неперечисляемые и геттеры/сеттеры.
Как можно создать точную копию объекта с помощью Object.create?
Чтобы создать точную копию объекта с помощью Object.create, нужно передать два аргумента: прототип объекта и дескрипторы свойств объекта, используя метод Object.getOwnPropertyDescriptors.
// клон obj c тем же прототипом (с поверхностным копированием свойств)
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
Какую историю развития объектов в JavaScript можно извлечь из данного текста?
Свойство prototype функции-конструктора существует с давних времён. В 2012 году был добавлен метод Object.create, который позволяет создавать объекты с указанным прототипом. В связи с отсутствием возможности получать или изменять свойство [[Prototype]] было введено свойство-аксессор __proto__. В 2015 году были добавлены методы Object.setPrototypeOf и Object.getPrototypeOf, заменяющие __proto__.
Какие операции могут ломать внутренние оптимизации для операций доступа к свойствам объекта?
Изменение прототипа на лету с помощью Object.setPrototypeOf и сеттера __proto__.
Что такое __proto__?
__proto__ является геттером/сеттером (аксессором) для [[Prototype]] объекта.
Какой объект можно создать без прототипа?
“Простейший” объект, то есть объект без прототипа, можно создать с помощью Object.create(null).
Какие методы объектов продолжат работать для объекта без прототипа?
Методы объектов, которые имеют вид Object.something(…), продолжат работать для объектов без прототипа.