javascript interview question #47

Как работает Object.setPrototypeOf в JavaScript? Что будет выведено на экран?

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

Теория

Функция Object.setPrototypeOf устанавливает новый прототип любому JavaScript объекту. Сам объект не меняется, но он “наследует” поведение объекта, прототип которого получает после setPrototype.

Убедиться в этом можно проверив внутреннее поле __proto__ объекта до модификации прототипа и после.

Для примера создадим объект с одним полем и массив с тремя элементами.

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

console.log('Original state');
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('Modified state');
console.log(user);            // Array { name: 'John' }
console.log(user[1]);         // 2
console.log(user.__proto__);  // [ 1, 2, 3 ]
console.log(user.length);     // 3

После модификации мы видим, что можно получить доступ к “родительскому” полю length и элементам массива arr по индексу.

Практика

В нашем оригинальном примере, произойдет то же самое. У user появится доступ к полю name от объекта типа Human, но ни одного своего поля не добавится.

Функция Object.keys возвращает массив полей объекта. Так как у user их нет, то и длина этого массива будет равна нулю.


ОТВЕТ: Первый console.log выведет на экран пустой массив, а второй — строку John.