1

로거 서비스를 작성했지만 이해할 수없는 오류가 있습니다. 여기 내 anger2 내 로거 제작

는 코드의 일부이다 :

import { Injectable } from "@angular/core"; 
@Injectable() 
export class LoggerService { 
    private _log: Function; 

    constructor() { 
     this._log = console.log; 

     this.blockDefaultConsoleMethods(); 
    } 

    public log(...args) { 
     this._log(args); 
    } 

    private blockDefaultConsoleMethods() { 
     console.log = console.info = console.warn = console.error =() => null; 
    } 
} 

오류 : TypeError: Illegal invocation

주요 아이디어는 기본 콘솔 방법하지 않는 직접이 같은 console.log 호출

+0

어디 오류 코드에 게재되는 이유는 무엇입니까? – toskv

+0

@toskv 어떤 메소드를 호출 할 때 – Illorian

+0

예제에 어떤 코드 줄이 있습니까? – toskv

답변

2

을 지양하는 것입니다 작업. 당신이 시도하고이처럼 호출 할 수있다 :

import { Injectable } from "@angular/core"; 
@Injectable() 
export class LoggerService { 
    private _log: Function; 

    constructor() { 
     this._log = console.log; 

     this.blockDefaultConsoleMethods(); 
    } 

    public log(...args) { 
     Function.prototype.apply.call(this._log, console, args); // <--- change here 
    } 

    private blockDefaultConsoleMethods() { 
     console.log = console.info = console.warn = console.error =() => null; 
    } 
} 

Working Plunker for example usage

+0

예, 작동합니다. 이유를 이해할 수 있습니까?) – Illorian

+1

개발자 도구가 특정 탭에 대해 처음 열릴 때까지 콘솔 개체가 노출되지 않습니다. 그리고'console.log'는 내부에있는'this' 객체가 그 객체의 객체에 접근 할 것을 기대합니다. 여러분은 직접 객체를 호출 할 필요가 없습니다. 그래서'Function.prototype.apply.call' ('console' 인자 참조)과 같이 컨텍스트를 추가해야합니다. – rinukkusu

+0

정말 고마워! – Illorian

관련 문제