Прототипы, наследование Flashcards

1
Q

Что такое скрытое свойство [[Prototype]] у объектов?

A

Скрытое свойство [[Prototype]] у объектов - это ссылка на другой объект, который является прототипом, откуда объект наследует свойства и методы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Как называется процесс, когда JS ищет свойство в объекте и его прототипах?

A

Это называется прототипное наследование.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Как задать прототип объекту через свойство __proto__?

A

Можно задать прототип объекту через свойство __proto__, например, obj.__proto__ = prototype, где obj - объект, а prototype - прототип.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Можно ли задать цепочку прототипов для объектов? Если да, то есть ли какие-либо ограничения?

A

Да, можно задать цепочку прототипов. Однако, ссылки не могут идти по кругу, и значение .__proto__ может быть только объектом или null. Также объект может наследоваться только от одного объекта (один [[Prototype]]).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое __proto__ и как он связан с [[Prototype]]?

A

__proto__ является геттером/сеттером по отношению к [[Prototype]], но они не являются одним и тем же. __proto__ устарело и рекомендуется использовать методы Object.getPrototypeOf и Object.setPrototypeOf для чтения и записи значения [[Prototype]] соответственно.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Можно ли использовать прототип при записи/удалении свойств объекта?

A

Нет, прототип используется только для чтения свойств. Операции записи/удаления работают напрямую с объектом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Как свойство-аксессор обрабатывает операцию записи?

A

Свойство-аксессор – исключение, так как запись в него обрабатывается сеттером.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какое значение имеет ключевое слово “this” при вызове метода в JavaScript?

A

При вызове метода this - всегда объект перед точкой, независимо от того, где находится метод: в объекте или его прототипе.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что проходит цикл for..in при переборе свойств объекта?

A

Цикл for..in проходит как по собственным, так и по унаследованным свойствам объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как получить только собственные ключи объекта?

A

Можно воспользоваться методом Object.keys(obj), который возвращает только собственные ключи объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как отфильтровать собственные и унаследованные свойства объекта?

A

Можно воспользоваться методом obj.hasOwnProperty(key), который возвращает true, если key является собственным свойством obj, и false, если свойство унаследовано.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Почему в цикле for..in не проходят свойства из Object.prototype?

A

Все свойства в Object.prototype имеют флаг enumerable, установленный в false, что делает их неперечисляемыми.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Какой эффект имеет установка F.prototype на объект, созданный с помощью new F()?

A

Установка F.prototype на объект, созданный с помощью new F(), делает объект, на котором вызывается new F(), наследником объекта, который был установлен в F.prototype в момент вызова конструктора F.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Можно ли изменить F.prototype после создания объектов с помощью new F()?

A

Да. Однако изменение F.prototype не повлияет на уже созданные объекты, они будут продолжать ссылаться на старый объект в качестве [[Prototype]].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Какие свойства есть у свойства по умолчанию в объекте prototype у функций-конструкторов?

A

У свойства prototype по умолчанию у функций-конструкторов есть единственное свойство constructor, которое ссылается на саму функцию-конструктор.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что произойдет, если изменить свойство prototype функции-конструктора?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Как избежать потери свойства constructor при изменении свойства prototype функции-конструктора?

A

Чтобы избежать потери свойства constructor при изменении свойства prototype функции-конструктора, его можно заново создать или не перезаписывать prototype полностью, а добавлять к нему свойства по одному.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Какие методы доступны у нового объекта, созданного с помощью new Object() или литерала {}?

A

У нового объекта есть доступ ко всем методам объектов, которые берутся из Object.prototype.

19
Q

Как связан объект с его прототипом?

A

При создании нового объекта его [[Prototype]] ссылается на прототип, указанный в конструкторе, или на Object.prototype для литералов.

20
Q

Какое значение имеет свойство __proto__ у объекта Object.prototype?

A

У Object.prototype свойство __proto__ имеет значение null, так как он не имеет своего прототипа.

21
Q

Какие объекты хранят свои методы в прототипах?

A

Объекты, такие как Array, Date, Function и другие, хранят свои методы в прототипах.

22
Q

Что становится прототипом при создании массива?

A

При создании массива, его прототипом становится Array.prototype.

23
Q

Какой объект находится выше всех в иерархии встроенных прототипов?

A

В иерархии встроенных прототипов выше всех находится Object.prototype.

24
Q

Почему говорят, что все наследуется от объектов?

A

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

25
Q

Как JavaScript находит нужный метод, если у нескольких прототипов есть методы с одинаковым именем?

A

JavaScript ищет метод снизу вверх, начиная с прототипа объекта, и использует первый найденный метод с указанным именем.

26
Q

Где находятся методы для примитивов в JavaScript?

A

Методы для примитивов в JavaScript находятся в прототипах соответствующих объектов-обёрток: String.prototype, Number.prototype и Boolean.prototype.

27
Q

Есть ли у значения null и undefined методы, свойства и прототипы?

A

Нет, значения null и undefined не имеют объектов-обёрток и, следовательно, не имеют методов, свойств и прототипов.

28
Q

Какую рекомендацию дают по изменению встроенных прототипов?

A

Не рекомендуется изменять встроенные прототипы для своих нужд.

29
Q

Что такое полифилы?

A

Полифилы - это эмуляция метода, который существует в спецификации JavaScript, но еще не поддерживается текущим движком JavaScript.

30
Q

Зачем используют возможность изменения встроенных прототипов?

A

Возможность изменения встроенных прототипов используется для создания полифилов - эмуляции методов, которые еще не поддерживаются текущим движком JavaScript.

31
Q

Что такое заимствование у прототипов?

A

Когда берем метод из одного объекта и копируем в другой.

32
Q

Приведите пример заимствования у прототипа.

A

Например, создаем объект obj, похожий на массив (псевдомассив), у которого есть индексы и length. Понадобился метод из Array.
obj.join = Array.prototype.join; // теперь метод работает для объекта obj, так как для join важно только наличие индексов и свойства length

33
Q

Можно ли унаследовать методы объекта, если объект уже наследует от другого объекта?

A

Это будет невозможно, так как объект может наследовать только от одного объекта одновременно.

34
Q

Как можно сделать доступными методы массива для нашего объекта obj с помощью наследования?

A

Можно унаследовать от массива, установив obj.__proto__ равным Array.prototype. Однако, если obj уже наследует от другого объекта, это будет невозможно – может наследовать только от одного объекта одновременно.

35
Q

Какие методы нужно использовать вместо свойства __proto__ для работы с прототипами объектов?

A

Нужно использовать методы Object.create, Object.getPrototypeOf и Object.setPrototypeOf.

36
Q

Можно ли установить прототип объекта на пустой объект? Если да, то каким методом?

A

Да, можно. Прототип объекта можно установить на пустой объект с помощью метода Object.setPrototypeOf(obj, {}).

37
Q

Что такое “продвинутое” клонирование объекта?

A

“Продвинутое” клонирование объекта - это создание точной копии объекта с помощью метода Object.create с использованием Object.getOwnPropertyDescriptors для клонирования всех свойств, включая неперечисляемые и геттеры/сеттеры.

38
Q

Как можно создать точную копию объекта с помощью Object.create?

A

Чтобы создать точную копию объекта с помощью Object.create, нужно передать два аргумента: прототип объекта и дескрипторы свойств объекта, используя метод Object.getOwnPropertyDescriptors.
// клон obj c тем же прототипом (с поверхностным копированием свойств)
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));

39
Q

Какую историю развития объектов в JavaScript можно извлечь из данного текста?

A

Свойство prototype функции-конструктора существует с давних времён. В 2012 году был добавлен метод Object.create, который позволяет создавать объекты с указанным прототипом. В связи с отсутствием возможности получать или изменять свойство [[Prototype]] было введено свойство-аксессор __proto__. В 2015 году были добавлены методы Object.setPrototypeOf и Object.getPrototypeOf, заменяющие __proto__.

40
Q

Какие операции могут ломать внутренние оптимизации для операций доступа к свойствам объекта?

A

Изменение прототипа на лету с помощью Object.setPrototypeOf и сеттера __proto__.

41
Q

Что такое __proto__?

A

__proto__ является геттером/сеттером (аксессором) для [[Prototype]] объекта.

42
Q

Какой объект можно создать без прототипа?

A

“Простейший” объект, то есть объект без прототипа, можно создать с помощью Object.create(null).

43
Q

Какие методы объектов продолжат работать для объекта без прототипа?

A

Методы объектов, которые имеют вид Object.something(…), продолжат работать для объектов без прототипа.