Я уже который день пытаюсь с этим разобраться, поэтому не могли бы вы подсказать, правильно ли я уловил суть?
Когда мы создаём объект через функцию-конструктор, в самой функции, хотя мы его и не указывали, присутствует скрытое свойство prototype. В самом начале оно является простым объектом с сылкой на функцию-конструктор.
function User(name, surname) {
name = name,
surname = surname
}
console.log(User.prototype); // {constructor: User {}}
Если мы хотим, чтобы новые экземпляры объекта унаследовали свойства из функции конструктора, у нас есть два варианта: мы можем добавить необходимые свойства прямиком в тело функции, либо в объект prototype. Но между этими двумя способами, конечно, есть различия.
Когда мы добавляем свойства прямиком в тело функции, они дублируются каждый раз при создании нового объекта.
Если же мы добавляем свойства в объект F.prototype, то оно создаётся один раз и находится только в этом объекте. Однако новый экземпляр объекта будет иметь доступ ко всем его ключам, но не к самому F.prototype.
function User(name, surname) {
this.name = name,
this.surname = surname
}
User.prototype.sayHello = function () {
return `Всем привет! Я функция, и я живу в объекте User.prototype`;
}
let user1 = new User('Vasya', 'Big');
console.log(user1) // User { name: 'Vasya', surname: 'Big' }
console.log(user1.sayHello()); // всё работает
И ещё один момент. Только вчера до меня дошло, что каждый раз, когда мы создаём какой-либо объект, даже используя литеральную нотацию, мы всё равно используем функцию-конструктор (Object).
/*
function Object(value1, value2) {
this.prop1 = value1,
this.prop2 = value2
}
let anyObject = new Object(value1, value2);
*/
let anyObject = {
prop1: value1,
prop2: value2
}
Раньше я думал, что Object - это корневой объект, но на самом деле это функция-конструктор, у которого также есть свойство "prototype". И именно от объекта Object.prototype наследуются все встроенные методы новых объектов.
console.log(typeof Object); // function
console.log(typeof Object.prototype); // object
Object.prototype.someString = 'какое-нибудь свойство';
let obj = {
name: 'Vasya',
surname: 'Big'
}
console.log(obj.someString); //какое-нибудь свойство
Если я где-то ошибаюсь или вам есть, что дополнить — буду очень рад прочитать ваши ответы.