프록시를 JSON으로 문자열화하는 방법

Proxy 을 처리해야 하는 경우 반환된 값을 문자열화해야 하는 지점에 도달할 수 있습니다.

다행스럽게도 ECMA 스크립트의 JSON implementation을 사용하면 개체에 대한 사용자 정의toJSON 메서드를 정의할 수 있습니다. 좋은 내장 예제는 Date.prototype.toJson 입니다. toJSON를 사용하면 문자열화된 개체의 일부가 정확히 무엇인지 미세 조정할 수 있습니다.

프록시에서 기본 개체에 직접 액세스할 수 있고 오히려 get 트랩에서 사용자 지정 JSON을 정의할 수 있습니다.

다음 예제는 이를 쉽게 해결합니다.

const personProxy = new Proxy({}, {
  get: function (target, key) {
    if (key === 'toJSON') {
      return () => ({ name: 'bar' })
    }

    if (key === 'name') return 'foo'
  }
})


프록시에서 name 값을 직접 호출하면 name 를 반환합니다.

그러나 Proxy 인스턴스를 JSON.stringify에 전달할 때 Proxy에서 toJSON 호출을 시도합니다. get TraptoJSON을 함수로 처리하기 때문에 stringify 구현은 실제로 멤버 함수인 것처럼 호출할 수 있습니다.

console.log('name', { name: personProxy.name })  // "name" "{ name: 'foo' }"
console.log('json', JSON.stringify(personProxy)) // "json" "{'name':'bar'}"

좋은 웹페이지 즐겨찾기