Прототип в JavaScript:-
Прототипы — это механизм, использующий этот объект JavaScript, который наследует функцию от других объектов, ИЛИ мы можем сказать, что когда мы создаем объект в JavaScript, механизм JavaScript автоматически прикрепляет некоторое свойство к объектам.
Механизм JavaScript прикрепляет некоторое свойство к переменной, массиву, объектам, мы можем получить доступ к этому свойству с помощью оператора точки. Из этого механизма мы узнали, что все в JavaScript является объектами.
const Person = { name: "John", greet() { console.log('My name is' + this.name) }; Person.greet() // My name is John.
В приведенном выше примере кода мы определили только два свойства: имя объекта Person и другое свойство — приветствие, но движок JavaScript внутренне прикрепляет приведенное ниже свойство к объектам человека.
__defineGetter__ __defineSetter__ __lookupGetter__ __lookupSetter__ __proto__ name constructor greet hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf
Когда мы пытаемся получить доступ к одному из них: -
Person.toString(); // "[object Object]"
Это работает (даже если непонятно, что делает toString()
).
Что это за дополнительные свойства и откуда они берутся?
Каждый объект в JavaScript имеет встроенное свойство, которое называется его прототипом. Прототип сам по себе является объектом, поэтому прототип будет иметь свой собственный прототип, создавая так называемую цепочку прототипов. Цепочка заканчивается, когда мы достигаем прототипа, у которого есть null
для собственного прототипа.
Если мы хотим узнать о прототипе вашего объекта, вы можете использовать это: -
Object.getPrototypeOf(myObject); // Object { }
Это объект с именем Object.prototype
, и это самый простой прототип, который есть у всех объектов по умолчанию. Прототипом Object.prototype
является null
, поэтому он находится в конце цепочки прототипов:
Прототип объекта не всегда Object.prototype
.
const myDate = new Date(); let object = myDate; do { object = Object.getPrototypeOf(object); console.log(object); } while (object); // Date.prototype // Object { } // null
Этот код создает объект Date
, затем проходит по цепочке прототипов, регистрируя прототипы. Это показывает нам, что прототипом myDate
является объект Date.prototype
, а прототипом это является Object.prototype
.
На самом деле, когда вы вызываете знакомые методы, такие как myDate2.getMonth()
, вы вызываете метод, определенный в Date.prototype
.