Некоторые заметки для быстрого пересмотра
функция с пользовательским свойством
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 вместо проверки конструктора экземпляра.