Как заставить 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();
Другие вопросы по тегам