> 웹 프론트엔드 > JS 튜토리얼 > Javascript 정복 - 고급 주제 #프록시 및 Reflect API

Javascript 정복 - 고급 주제 #프록시 및 Reflect API

Patricia Arquette
풀어 주다: 2024-12-16 20:45:23
원래의
670명이 탐색했습니다.

Conquer Javascript - Advanced Topics #Proxies and Reflect API

소개

JavaScript 개발 영역에서 Proxies 및 Reflect API는 객체 작업을 가로채고 수정할 수 있는 강력한 도구입니다. 이러한 API는 애플리케이션에서 개체의 동작을 확장하고 사용자 정의하는 유연하고 효율적인 방법을 제공합니다.

이 블로그 게시물에서는 Proxies와 Reflect의 핵심 개념, 사용 사례 및 실제 사례를 살펴보며 복잡한 내용을 자세히 살펴보겠습니다.

프록시와 리플렉트란 무엇인가요?

프록시는 다른 개체의 중개자 역할을 하며 해당 개체에서 수행되는 작업을 가로채는 개체입니다. 속성 액세스, 할당, 함수 호출 등과 같은 작업에 대한 사용자 정의 동작을 정의할 수 있습니다.

반면에 Reflect API는 언어 연산자의 동작을 반영하는 정적 메서드 세트를 제공합니다. 프로그래밍 방식으로 이러한 작업에 액세스할 수 있으므로 사용자 정의 프록시 핸들러를 더 쉽게 구현하고 보다 표준화된 방식으로 개체로 작업할 수 있습니다.

핵심 개념

  • 프록시 개체:
    • 대상 객체에 대한 작업을 가로채는 프록시 객체를 생성합니다.
    • target(프록시할 개체)과 handler(트랩 기능이 포함된 개체)라는 두 가지 인수를 사용합니다.
  • 트랩 기능:
    • 프록시에서 특정 작업이 수행될 때 호출되는 핸들러 개체 내에 정의된 함수입니다.
    • 일반적인 트랩 기능은 다음과 같습니다.
      • get: 속성 액세스를 차단합니다.
      • set: 속성 할당을 가로챕니다.
      • 있음: 속성 존재 확인을 가로챕니다.
      • deleteProperty: 속성 삭제를 차단합니다.
      • 적용: 함수 호출을 차단합니다.
      • constructor: new를 사용하여 객체 생성을 가로챕니다.
      • ownKeys: Object.getOwnPropertyNames 및 Object.getOwnPropertySymbols에 대한 호출을 차단합니다.
      • getOwnPropertyDescriptor: Object.getOwnPropertyDescriptor에 대한 호출을 차단합니다.
      • 정의프로퍼티: Object.defineProperty에 대한 호출을 차단합니다.
      • PreventExtensions: Object.preventExtensions에 대한 호출을 차단합니다.

사용 사례

Proxies와 Reflect는 JavaScript 개발에서 광범위한 애플리케이션을 제공합니다.

데이터 검증

const target = {};
const handler = {
    set(target, property, value) {
        if (typeof value !== 'string') {
            throw new Error('Value must be a string');
        }
        target[property] = value;
        return true;
    }
};

const proxy = new Proxy(target, handler);

proxy.name = 'Alice'; // Valid
proxy.age = 42; // Throws an error
로그인 후 복사
로그인 후 복사

이 예에서는 해당 속성에 할당된 값 유형의 유효성을 검사하는 프록시를 만듭니다. 문자열이 아닌 값을 할당하려고 하면 오류가 발생합니다.

캐싱

const target = {};
const handler = {
    set(target, property, value) {
        if (typeof value !== 'string') {
            throw new Error('Value must be a string');
        }
        target[property] = value;
        return true;
    }
};

const proxy = new Proxy(target, handler);

proxy.name = 'Alice'; // Valid
proxy.age = 42; // Throws an error
로그인 후 복사
로그인 후 복사

여기에서는 비용이 많이 드는 계산 결과를 캐시하는 프록시를 만듭니다. get Trap 함수는 대상 객체에 속성이 존재하는지 확인합니다. 그렇지 않은 경우 값을 계산하여 대상 개체에 저장합니다. 동일한 속성에 대한 후속 액세스는 캐시된 값을 반환합니다.

로깅 및 디버깅

const target = {};
const handler = {
    get(target, property) {
        if (!target.hasOwnProperty(property)) {
            target[property] = computeValue(property);
        }
        return target[property];
    }
};

const proxy = new Proxy(target, handler);

console.log(proxy.expensiveCalculation); // Caches the result
로그인 후 복사

이 예에서는 속성 액세스 및 할당을 기록하는 방법을 보여줍니다. get 및 set은 속성이 액세스되거나 수정될 때마다 로그 메시지를 콘솔에 트랩합니다.

보안

const target = {};
const handler = {
    get(target, property) {
        console.log(`Getting property: ${property}`);
        return target[property];
    },
    set(target, property, value) {
        console.log(`Setting property ${property} to ${value}`);
        target[property] = value;
        return true;
    }
};

const proxy = new Proxy(target, handler);

proxy.name = 'Bob';
console.log(proxy.name);
로그인 후 복사

이 예에서는 비밀번호 속성을 마스킹하는 프록시를 만듭니다. get 트랩은 비밀번호 속성에 대한 액세스를 가로채고 실제 값 대신 '******'를 반환합니다.

사용자 정의 개체 동작

const target = {
    username: 'secret',
    password: 'password123'
};

const handler = {
    get(target, property) {
        if (property === 'password') {
            return '******';
        }
        return target[property];
    }
};

const proxy = new Proxy(target, handler);

console.log(proxy.username); // Output: secret
console.log(proxy.password); // Output: ******
로그인 후 복사

이 예에서는 fullName 속성에 대한 사용자 정의 getter를 생성하는 방법을 보여줍니다. get 트랩은 fullName 속성에 대한 액세스를 가로채고 firstName 및 lastName 속성의 연결을 반환합니다.

리플렉트 API

Reflect API는 언어 연산자의 동작을 미러링하는 정적 메서드를 제공합니다. 프록시와 함께 사용하여 사용자 정의 동작을 구현하고 필요한 경우 대상 개체에 작업을 전달할 수 있습니다.

const target = {};
const handler = {
    get(target, property) {
        if (property === 'fullName') {
            return `${target.firstName} ${target.lastName}`;
        }
        return target[property];
    }
};

const proxy = new Proxy(target, handler);

proxy.firstName = 'John';
proxy.lastName = 'Doe';

console.log(proxy.fullName); // Output: John Doe
로그인 후 복사

이 예에서 get 트랩은 Reflect.get을 사용하여 속성 액세스를 대상 개체에 전달합니다. 이를 통해 실제 속성 액세스 전후에 사용자 정의 동작을 구현할 수 있습니다.

결론

프록시와 Reflect는 JavaScript 개발 기능을 크게 향상시킬 수 있는 강력한 도구입니다. 핵심 개념과 실제 적용 방식을 이해하면 더욱 유연하고 효율적이며 안전한 코드를 만들 수 있습니다.

이러한 API는 코드를 복잡하게 만들 수 있으므로 신중하게 사용해야 합니다. 그러나 효과적으로 사용하면 새로운 가능성을 열고 JavaScript 프로젝트를 새로운 차원으로 끌어올릴 수 있습니다.

위 내용은 Javascript 정복 - 고급 주제 #프록시 및 Reflect API의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿