Как заставить Object.assign работать?
Фон
Я пытаюсь расширить функциональность старого объекта с помощью Object.assign
, передав новый объект с дополнительной функцией.
const oldObj = () => {
const printLog = () => console.log("hello");
return {printLog};
};
const newObj = () => {
const test = () => {
printLog(); //fails here!
console.log("world");
};
return {test};
};
const mix = Object.assign(oldObj(), newObj());
mix.printLog();
mix.test();
проблема
мой mix
объект не выполняется, хотя у него есть бот printLog
а также test
методы:
Object {printLog: function, test: function}
Вопрос
Как я могу исправить свой код так, чтобы test
функция будет работать как положено?
2 ответа
Решение
Для доступа printLog
Вы должны получить к нему доступ через this
, Тем не менее, ваша функция test
не может быть функцией стрелки, потому что функции стрелки используют this
контекст контекста, в котором они определены, поэтому, чтобы получить желаемый результат, измените printLog()
в this.printLog()
и переключатель test
от функции со стрелкой до обычной функции:
const oldObj = () => {
const printLog = () => console.log("hello");
return {printLog};
};
const newObj = () => {
const test = function() {
this.printLog(); //fails here!
console.log("world");
};
return {test};
};
const mix = Object.assign(oldObj(), newObj());
mix.printLog();
mix.test();
Изменить: изменить свой код на это:
const oldObj = () => {
const printLog = () => console.log("hello");
return {printLog};
};
const newObj = () => {
function test() {
this.printLog();
console.log("world");
};
return {test};
};
const mix = Object.assign(oldObj(), newObj());
mix.printLog();
mix.test();