this & object prototypes

Get Started. It's Free
or sign up with your email address
Rocket clouds
this & object prototypes by Mind Map: this & object prototypes

1. Прототип

1.1. Присвоение

1.1.1. Свойство foo найдено выше по цепочке прототипов, и оно не помечено "только для чтения"(writable:false), тогда новое свойство foo добавляется прямиком в объект myObject, скрытое поле

1.1.2. Свойство foo найдено выше по цепочке прототипов, и оно помечено "только для чтения"(writable:false), тогда добавление нового свойства foo в объект myObject, а так же скрытого поля запрещено. Если код исполняется в строгом режиме, то будет брошена ошибка, если нет, то просто операция будет проигнорирована.

1.1.3. Свойство foo найдено выше по цепочке прототипов, и foo -- это setter, тогда setter будет вызываться всегда. foo не будет добавлен myObject, и не будет переопределен.

1.2. Наследование

1.2.1. "OO"

1.2.2. "OLOO" (objects-linked-to-other-objects) Object.create(...)

2. Объекты

2.1. Синтаксис

2.1.1. Литерал

2.1.2. Конструктор

2.2. Типы

2.2.1. string

2.2.2. number

2.2.3. boolean

2.2.4. null

2.2.5. undefined

2.2.6. object

2.3. Встроеные объекты в JS

2.3.1. String

2.3.2. Number

2.3.3. Boolean

2.3.4. Object

2.3.5. Function

2.3.6. Array

2.3.7. Date

2.3.8. RegExp

2.3.9. Error

2.4. Копирование объектов

2.4.1. var newObj = JSON.parse( JSON.stringify( someObj ) );

2.4.2. Object.assign(..)

2.5. Дескрипторы свойств

2.5.1. writable (значение не можем поменять)

2.5.1.1. в strict mode получим TypeError

2.5.2. enumerable (убирает из цикла for..in)

2.5.3. configurable (если false, то изменять можно только с таким же дескриптором. особенность - перестаёт работать delete свойства)

2.6. Модификации объекта

2.6.1. Object.preventExtensions(..) -- запрещает расширять объект

2.6.2. Seal

2.6.2.1. Object.preventExtensions(..) + configurable:false

2.6.3. Freeze

2.6.3.1. Object.seal(..) + writable:false

2.7. Классы

2.7.1. Классы значит копии

2.7.2. JS автоматически не создаёт копии (как делают классы) между объектами

2.7.3. Реализация классов в JS создают больше проблем для дальнейшей разработки, чем решение поставленной проблемы.

3. this

3.1. Что это?

3.1.1. это НЕ

3.1.1.1. ссылка функции самой на себя

3.1.1.2. ссылка на лексический скоуп

3.1.2. это

3.1.2.1. биндинг, при исполнении функции со всеми референсами, которые определенены в момент вызова этой функции (где вызывается, а не описана)

3.2. Правила биндинга

3.2.1. Виды биндингов

3.2.1.1. 1. Биндинг по умолчанию

3.2.1.1.1. Автономная функция

3.2.1.2. 2. Явный биндинг

3.2.1.2.1. .call(...)

3.2.1.2.2. .apply(...)

3.2.1.3. 3. Жесткий биндинг

3.2.1.3.1. .bind(...)

3.2.1.4. 4. new биндинг

3.2.1.4.1. как работает?

3.2.2. Перекрытие биндингов. Что важнее?

3.2.2.1. 1. Функция вызвана с помощью new (new биндинг)? Если да, то this -- это вновь созданный объект. var bar = new foo()

3.2.2.2. 2. Функция вызвана с помощью call / apply (явный биндинг), даже если внутри имеется bind (жесткий биндинг)? Если да, то this -- это объект, который определен при неявном биндинге. var bar = foo.call( obj2 )

3.2.2.3. 3. Функция вызвана с контекстом (неявный биндинг)? this -- контекст объекта. var bar = obj1.foo()

3.2.2.4. 4. Иначе пробуем применить биндинг по умолчанию (биндинг по умолчанию). Если это 'strict mode', то получаем 'undefined', если нет, то this -- это global object. var bar = foo()

3.2.3. Исключения

3.2.3.1. Игнорирование this

3.2.3.1.1. Если в call / apply передать null / undefined в качестве параметра для биндинга, то эти значения будут игнорированы и биндинг будет производиться по правилу биндинга по умолчанию.

3.2.3.2. Безопасный this (Object.create(null))

3.2.3.3. Косвенные ссылки

3.2.3.3.1. Новый биндинг будет производиться по правилу биндинга по умолчанию

3.2.3.4. Мягкий биндинг

3.2.3.4.1. Способ перекрыть дефолтные значения для биндинга по умолчанию (не global / undefined), используя явный или неявный биндинг.

3.2.3.5. Лексический this

3.2.3.5.1. Лексический биндинг arrow-function не может быть переопределен (даже через new!).