2015-05-03 2 views
0

Код ниже будет работать в случае регулярных функций, но он не работает в случае объектных методов.Метод передачи построенного объекта функции в JavaScript

Я получаю следующее сообщение об ошибке:

return this.anotherService.get1(start, end); 
      ^
    TypeError: Cannot read property 'anotherService' of undefined 

Как переписать код, чтобы сделать getTransactions общее вспомогательную функцию выполняет различные методы, переданные в качестве аргументов?

class Service { 
    constructor(arg1) { 
    this.anotherService= new AnotherService(arg1); 
    } 

    getMethod1(start, end) { 
    return this.anotherService.get1(start, end); 
    } 

    getMethod2(start, end) { 
    return this.anotherService.get2(start, end); 
    } 
} 

function getTransaction1(arg1, arg2, arg3) { 
    let service = new Service(arg1); 
    getTransactions(arg2, arg3, service.getMethod1); 
}; 

function getTransaction2(arg1, arg2, arg3) { 
    let service = new Service(arg1); 
    getTransactions(arg2, arg3, service.getMethod2); 
}; 

function getTransactions(arg2, arg3, func) { 
    let start = ......; 
    let end = ........; 
    func(start, end).then(data => { 
    res.json(data); 
    }).catch(console.log); 
}; 

ответ

1

Вы можете использовать Function#bind, чтобы справиться с этим:

function getTransaction1(arg1, arg2, arg3) { 
    let service = new Service(arg1); 
    getTransactions(arg2, arg3, service.getMethod1.bind(service)); 
    // -------------------------------------------^^^^^^^^^^^^^^ 
} 

function getTransaction2(arg1, arg2, arg3) { 
    let service = new Service(arg1); 
    getTransactions(arg2, arg3, service.getMethod2.bind(service)); 
    // -------------------------------------------^^^^^^^^^^^^^^ 
} 

Function#bind возвращает новую функцию, которая при вызове будет вызывать оригинал this набор быть объект, который вы передаете bind. (Вы можете также передать дополнительные аргументы bind, но это не имеет значения здесь.)


Или, конечно, вы можете создать getMethod1 и getMethod2 внутри вашего конструктора с помощью жира функции стрелок, которые получают лексическую this связывания:

class Service { 
    constructor(arg1) { 
    this.anotherService= new AnotherService(arg1); 
    this.getMethod1 = (start, end) => { 
     return this.anotherService.get1(start, end); 
    }; 
    this.getMethod2 = (start, end) => { 
     return this.anotherService.get2(start, end); 
    }; 
    } 
} 

... в этом случае вам не придется менять getTransaction1 и getTransaction2 вообще.


Side Примечание: Функция декларация (то, что вы используете с getTransaction1 и getTransaction2) не являются заявлением, и поэтому они не завершается точкой с запятой.

+0

Право, я забыл этот простой полезный трюк JavaScript. не в первый раз :) – krl

Смежные вопросы