Как работает Object.setPrototypeOf() в JavaScript: Интересный пример

abef25b3 00df 4123 b0c5 cdbc18e728b8 HTML

В JavaScript метод Object.setPrototypeOf() позволяет установить прототип одного объекта на основе другого объекта. Но как это влияет на сам объект? Давайте рассмотрим пример, чтобы понять, что происходит, когда мы используем этот метод.

Пример задачи

Предположим, у нас есть следующий код:

function Human(name, age) {
this.name = name;
this.age = age;
}

let user = Object.setPrototypeOf({}, new Human("John", "55"));

console.log(Object.keys(user));
console.log(user.name);

Что мы увидим в консоли после выполнения этого кода?

Анализ работы Object.setPrototypeOf()

Метод Object.setPrototypeOf() действительно устанавливает новый прототип для объекта, но при этом сам объект не изменяется. Он просто начинает наследовать свойства и методы указанного прототипа.

Чтобы лучше понять, как это работает, рассмотрим следующий пример:

let user = { name: 'John' },
arr = [1, 2, 3];

console.log('Начальное состояние:');
console.log(user); // { name: 'John' }
console.log(user[1]); // undefined
console.log(user.__proto__); // {}
console.log(user.length); // undefined

Object.setPrototypeOf(user, arr); // устанавливаем arr как прототип для user

console.log('Измененное состояние:');
console.log(user); // Array { name: 'John' }
console.log(user[1]); // 2
console.log(user.__proto__); // [ 1, 2, 3 ]
console.log(user.length); // 3

После того как мы установили массив arr в качестве прототипа для объекта user, мы получили доступ к свойствам и методам массива, таким как длина массива (length) и значения элементов по их индексам.

Возвращаясь к нашему исходному примеру

В примере с Human происходит нечто похожее. Мы создаем новый объект user и устанавливаем его прототипом объект, созданный на основе конструктора Human. В результате объект user наследует свойства name и age, но сам при этом не получает новых собственных свойств.

Вот что произойдет:

  • Метод Object.keys(user) вернет пустой массив, потому что у объекта user нет собственных перечисляемых свойств.
  • Свойство user.name вернет "John", потому что это свойство доступно через прототип, установленный методом Object.setPrototypeOf().

Таким образом, в консоли мы увидим:

console.log(Object.keys(user)); // []
console.log(user.name); // John

Заключение

Метод Object.setPrototypeOf() может быть мощным инструментом для управления прототипами объектов в JavaScript. Он позволяет устанавливать прототипы динамически, предоставляя объекту доступ к свойствам и методам другого объекта без фактического добавления этих свойств в сам объект. Это делает Object.setPrototypeOf() полезным в ряде сценариев, но требует понимания его поведения, чтобы избежать неожиданных результатов.

Оцените статью