пересмотр функций (не прототипов) 🤥

Некоторые заметки для быстрого пересмотра

функция с пользовательским свойством

function aFunction() {
  this.someKey = "someValue";
}
aFunction.customKey = "customValue"
Вход в полноэкранный режим Выход из полноэкранного режима

в большинстве случаев это привязка во время выполнения, поэтому someKey не является свойством aFunction или aFunction.prototype.

Префикс custom был выбран, чтобы отличить от свойств по умолчанию, присутствующих в функции, таких как имя, вызывающая сторона и т.д. (Может, стоило назвать ее own? Прототипное похмелье! 🥱).
Пара customKey и customValue будет называться пользовательским свойством для целей данного документа.

Поскольку конструктор является функцией, он также имеет прототип, и рекурсия продолжается до бесконечности. Помните, что свойство [[Прототип]] — это только ссылка, а не реальная копия какого-либо объекта.

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

экземпляр

let aInstance = new aFunction()
console.log(aInstance)
Войти в полноэкранный режим Выйти из полноэкранного режима

Пользовательское свойство aFunction не присутствует в [[Прототипе]] aInstance, потому что [[Прототип]] aInstance — это aFunction.prototype.

прототип

  • За исключением случаев, когда мы говорим о свойстве prototype функции, мы всегда подразумеваем внутреннее свойство [[Prototype]], когда говорим prototype.
  • Внутреннее свойство [[Prototype]] представляет собой ссылку на некоторые свойства, а не копию этих свойств.
  • Каждый прототип (доступ к которому осуществляется с помощью Object.getPrototypeOf()) имеет свойство конструктора и свойство [[Prototype]].
  • Поскольку [[Прототип]] aInstance является значением aFunction.prototype, говорят, что [[Прототип]] aInstance — это aFunction.prototype.
  • Аналогично, о [[Прототипе]] функции aFunction говорят Object.prototype

пользовательское свойство

  • Пользовательское свойство похоже на обычные свойства Object: Object.create, Object.assign, Object.getPrototypeOf и т.д. Они не предназначены для вызова на экземплярах объектов.
  • Напротив, обычные свойства массива, такие как map, slice, push и т.д., находятся в [[прототипе]] экземпляра массива, потому что они предназначены для использования с экземпляром, а не с родительским объектом Array.

свойство конструктора

Обратите внимание, что свойство конструктора экземпляра можно изменить с помощью aInstance.constructor =, а родителя — с помощью Object.getPrototypeOf(aInstance).constructor. Поэтому используйте оператор instanceof вместо проверки конструктора экземпляра.

Оцените статью
devanswers.ru
Добавить комментарий