подскажите, когда мы делаем так: Object.assign(Sphere.prototype, newSphere);
то по сути программно добавляем свойство к объекту Sphere? Это же получается рефлексия?
Определение: рефлексия - процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.
По сути, мы "смешиваем" один объект с другим. Что касательно метода, он:
1) К объекту из первого аргумента - целевому объекту - примешивает объекты из остальных аргументов
2) Возвращает ссылку на целевой объект
По этому, грубо говоря, есть два способа использования метода:
1. Примешать свойства к существующему целевому объекту:
let obj1 = { // Целевой объект
foo: 'bar',
hello: 'world'
};
let obj2 = { // Примешиваемый объект
hello: 3,
spam: 'eggs'
};
Object.assign(obj1, obj2);
// Смешиваем
console.log(obj1);
// целевой объект трансформирован
// {foo: 'bar', hello: 3, spam: 'eggs'}
console.log(obj2);
// примешиваемый объект не тронут
// { hello: 3, spam: "eggs" }
2. Создать новый объект из несуществующего целевого:
let obj2 = { // Примешиваемый объект
spam: 'eggs'
};
let obj3 = Object.assign({ foo: 'baz' }, obj2);
// Пока метод выполняется, целевой объект не существует
// в текущем контексте исполнения
console.log(obj3);
// Целевой объект трансформирован и возвращен методом assign
// { foo: "baz", spam: "eggs" }
console.log(obj2);
// Примешиваемый объект не тронут
// { spam: "eggs" }
Также нужно понимать, что метод не возвращает новый объект, а возвращает ссылку на целевой. Представим ситуацию: мы использовали существующий объект как целевой, и решили записать результат выполнения метода в переменную. Теперь меняем объект из переменной, например добавляем свойство. И из-за того, что ссылка та же самая, то целевой объект так же будет изменен: