#angular #typescript
#angular #typescript
Вопрос:
Я пишу оболочку для console.log(), чтобы у меня был некоторый контроль над ее запуском.
Я могу заставить ее работать, когда я использую средство получения, но я хочу использовать обычную функцию, чтобы я мог передавать некоторые аргументы.
Я хочу, чтобы она функционировала так же, как при использовании средства получения, поскольку оно выводит правильный класс и номер строки в консоли.
Когда я использую средство получения, на консоль выводится правильное сообщение, имя класса и номер строки:
get info() {
return console.info.bind(console);
}
вызывается:
this.logger.info('this is a log');
результаты в консоли:
это журнал
Когда я использую функцию, ничего не выводится на консоль
public info() {
return console.info.bind(console);
}
вызывается:
this.logger.info('this is a log');
результат в пустой консоли:
Ответ №1:
Когда вы используете функцию, она просто возвращает ссылку на функцию, связанную с this
ссылкой`, которую вы передали, когда вы вызываете ее в первый раз.
Итак, вам нужно снова вызвать возвращаемый объект функции с параметром. В качестве примера я сделал то же самое в приведенном ниже классе es6:
class Test{
info() {
return console.info.bind(console);
}
}
let test = new Test();
test.info()("test");
Если это нужно сделать за один шаг, мы можем использовать либо call
либо apply
вместо bind. call
or apply
немедленно вызывает функцию, в отличие от bind, которая просто свяжет this
ссылку и вернет связанную функцию.
Для использования call
:
info(){
return console.info.call(console, ...arguments);
}
и apply
:
info(){
return console.info.apply(console, arguments);
}
С другой стороны, когда вы используете средство получения, доступ к свойству, подобному info
, приведет к вызову средства получения и возврату ссылки на функцию, которую вы немедленно вызываете.
class Test{
get info() {
return console.info.bind(console);
}
}
let test = new Test();
test.info("test");
test.info -> returns the function reference
test.info("test") -> invokes the returned reference;
Ответ №2:
public info() {
return console.info.apply(console, arguments)
}
Этого будет достаточно.