목차
기본 작업
Question
总结
웹 프론트엔드 View.js vue3에서 Proxy에 Reflect를 사용해야 하는 이유는 무엇입니까?

vue3에서 Proxy에 Reflect를 사용해야 하는 이유는 무엇입니까?

Jun 01, 2023 pm 06:55 PM
vue3 proxy reflect

Vue를 사용해본 사람들은 Vue의 응답 구현이 Proxy를 사용하고 Reflect와 함께 사용된다는 것을 알고 있습니다. Proxy 및 Reflect 문서를 볼 때 가장 눈에 띄는 것은 Reflect 개체의 정적 메서드가 Proxy 프록시와 동일한 이름을 가지고 있다는 것입니다. Reflect는 객체를 조작하는 데 사용할 수 있습니다. 프록시는 객체를 프록시할 수 있지만 때때로 프록시 프록시 메소드에서 Reflect를 사용해야 하는 이유를 찾지 못했습니다.

기본 작업

Reflect 객체의 정적 메소드는 동일한 이름을 갖습니다. Proxy Proxy 메소드로 13가지 종류가 있으며, get과 set의 예시는 다음과 같습니다

const tempObj = { a: 1 };
Reflect.get(tempObj, 'a'); // 返回 1
Reflect.set(tempObj, 'a', 2); // 返回true 表示设置成功, a的值变2

const tempObj1 = { a: 1 };
const handler = {
  get: function (obj, prop, receiver) {
    return prop === 'a' ? 1000 : obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    console.log(prop);
    obj[prop] = prop === 'a' ? 6 : value;
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.a; // proxyObj => {a: 1000}
proxyObj.a = 2; // proxyObj => {a: 6}
로그인 후 복사

Question

Proxy가 다른 작업을 하지 않고 직접 반환하는 경우

const tempObj1 = { a: 1 };
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.a; // proxyObj => {a: 1}
proxyObj.a = 2; // proxyObj => {a: 2}
로그인 후 복사

위 상황에서 Proxy는 별도의 조치 없이 차단을 처리할 수 있습니다. Reflect를 사용하는 것보다 훨씬 간단합니다. 값이므로 원래 개체를 가리키므로 값이 거짓입니다

잘못된 개체를 가리킨다고는 하지만 여전히 값이 정확하지는 않습니다

const tempObj1 = {
  a: 1,
  get value() {
    console.log(this === proxyObj); // false
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value;
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.value; // 1
로그인 후 복사

문제가 있습니다. 출력 결과가 예상과 다름 >obj[prop]. 의미와 결과는 동일합니다. 그럼 쓸모없는 다른 수신자 매개변수는 없나요? 결과는 물론 예상과 일치합니다. receiver은 프록시 객체나 원본 객체를 참조하지 않고 실행 컨텍스트를 참조합니다(문장은 다음과 같습니다. 특정 방식으로, 누가 누구를 가리키는지, 이것이 예상되는 것입니다. 여기서 child을 호출하므로 예상되는 지점은 child</code여야 합니다. > 여기서는 <code>receiver[prop]를 직접 사용한다고 생각할 수 있지만 이렇게 하면 실행 오버플로가 발생합니다. child.value, child.value는 아직 실행되지 않았으며 receiver[prop]가 다시 실행되어 무한정 계속 실행됩니다

Reflect.get(target, key, receive)receiver 매개변수는 this를 추가하지 않고 this 포인터를 수정합니다. target을 가리킨 다음 receiver

프록시 개체에서 this를 사용할 때는 를 사용해야 합니다. 반영</ code> 이런 방식으로 우리는 항상 예상 값을 얻을 수 있습니다<p></p><p>Summary<code>Reflect.get(obj, prop)换成obj[prop],这等于没换,意义和结果是一样的,这不是还有一个receiver参数没有用嘛

const parent = {
  a: 1,
  get value() {
    console.log(this === child); // false
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value;
    return true;
  },
};

const proxyObj = new Proxy(parent, handler);
const child = Object.setPrototypeOf({ a: 2 }, proxyObj);
child.value; // 1
로그인 후 복사

this指向正确,结果也当然和期望一致,receiver的不是指代理对象,也不是指原对象,而是执行上下文(有句话是这么说的,不用特定方式改变this的情况下,谁调用指向谁,这就是期望的),这里child调用的value所以期望的指向应该是child, 这里你可能想到直接用receiver[prop]不行了,这样会出现执行溢出,receiver[prop]相当于child.valuechild.value还没执行完,receiver[prop]又执行了,就会无限在执行

Reflect.get(target, key, receiver)中的receiver参数修改了this指向,不加this指向target, 加了后指向receiver

代理对象中有用到this时一定要用到Reflect,这样才能得到一直符合期望的值

总结

vue3中的代理对象到得的都是符合期望的值,在拦截中做了收集和更新,所以一定要在Proxy的拦截函数中使用Reflect

vue3의 프록시 객체는 가로채기에서 예상 값을 수집하고 업데이트하므로 반드시 Proxy<에서 /code>의 가로채기 기능에 <code>Reflect를 사용하여 처리합니다

항상 기대값을 얻는 방법은 Proxy가 없는 것과 같습니다🎜
const parent = {
  a: 1,
  get value() {
    console.log(this === child); // true
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    Reflect.get(obj, prop)
   - return obj[prop];
   + retrun Reflect.get(obj, prop, receiver)
  },
  set: function (obj, prop, value, receiver) {
   - obj[prop] = value;
   + Reflect.get(obj, prop, value, receiver)
    return true;
  },
};

const proxyObj = new Proxy(parent, handler);
const child = Object.setPrototypeOf({ a: 2 }, proxyObj);
child.value; // 2
로그인 후 복사

위 내용은 vue3에서 Proxy에 Reflect를 사용해야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Nginx Proxy Manager 구성 분석 및 최적화 Nginx Proxy Manager 구성 분석 및 최적화 Sep 26, 2023 am 09:24 AM

NginxProxyManager 구성 분석 및 최적화 개요: NginxProxyManager는 Nginx 기반의 역방향 프록시 관리 도구로 역방향 프록시 서버를 쉽게 구성하고 관리하는 데 도움이 됩니다. NginxProxyManager를 사용하는 과정에서 서버 구성을 분석하고 최적화하여 서버의 성능과 보안을 향상시킬 수 있습니다. 구성 분석: 구성 파일 위치 및 구조: NginxProxyManag

vue3+vite: src에서 이미지를 동적으로 가져오기 위해 require를 사용할 때 오류를 해결하는 방법 vue3+vite: src에서 이미지를 동적으로 가져오기 위해 require를 사용할 때 오류를 해결하는 방법 May 21, 2023 pm 03:16 PM

vue3+vite:src는 require를 사용하여 이미지를 동적으로 가져오고 vue3+vite는 여러 이미지를 동적으로 가져옵니다. vue3을 사용하는 경우 require는 이미지를 사용할 수 없습니다. imgUrl:require(' .../assets/test.png') 와 같은 vue2는 typescript가 require를 지원하지 않기 때문에 가져오므로 이를 해결하는 방법은 다음과 같습니다. waitimport를 사용합니다.

Vue3에서 페이지의 일부 콘텐츠를 새로 고치는 방법 Vue3에서 페이지의 일부 콘텐츠를 새로 고치는 방법 May 26, 2023 pm 05:31 PM

페이지를 부분적으로 새로 고치려면 로컬 구성 요소(dom)의 다시 렌더링만 구현하면 됩니다. Vue에서 이 효과를 얻는 가장 쉬운 방법은 v-if 지시어를 사용하는 것입니다. Vue2에서는 v-if 명령을 사용하여 로컬 DOM을 다시 렌더링하는 것 외에도 새 빈 구성 요소를 만들 수도 있습니다. 로컬 페이지를 새로 고쳐야 할 경우 이 빈 구성 요소 페이지로 점프한 다음 다시 돌아올 수 있습니다. 빈 원본 페이지의 beforeRouteEnter 가드. 아래 그림과 같이 Vue3.X에서 새로 고침 버튼을 클릭하여 빨간색 상자 안에 DOM을 다시 로드하고 해당 로딩 상태를 표시하는 방법입니다. Vue3.X의 scriptsetup 구문에 있는 구성 요소의 가드에는

동적 함수 생성을 구현하려면 Go 언어 문서에서 Reflect.MakeFunc 함수를 알아보세요. 동적 함수 생성을 구현하려면 Go 언어 문서에서 Reflect.MakeFunc 함수를 알아보세요. Nov 03, 2023 pm 07:04 PM

동적 함수 생성을 구현하려면 Go 언어 설명서에서 Reflect.MakeFunc 함수를 알아보세요. Go 언어에서 Reflect 패키지는 런타임 시 유형 정보를 구문 분석하고 운영하기 위한 일련의 함수와 유형을 제공합니다. 그 중 Reflect.MakeFunc 함수는 런타임 시 동적으로 함수를 생성하는 데 사용할 수 있는 매우 강력한 함수입니다. Reflect.MakeFunc 함수는 다음과 같이 정의됩니다: funcMakeFunc(typType,fn

Vue3가 마크다운을 구문 분석하고 코드 강조 표시를 구현하는 방법 Vue3가 마크다운을 구문 분석하고 코드 강조 표시를 구현하는 방법 May 20, 2023 pm 04:16 PM

Vue로 블로그 프론트엔드를 구현하려면 마크다운 파싱을 구현해야 합니다. 코드가 있는 경우 코드 하이라이팅을 구현해야 합니다. markdown-it, vue-markdown-loader,marked,vue-markdown 등과 같은 Vue용 마크다운 구문 분석 라이브러리가 많이 있습니다. 이 라이브러리는 모두 매우 유사합니다. 여기서는 Marked가 사용되었고, 코드 하이라이팅 라이브러리로 하이라이트.js가 사용되었습니다. 구체적인 구현 단계는 다음과 같습니다. 1. 종속 라이브러리를 설치합니다. vue 프로젝트에서 명령 창을 열고 다음 명령 npminstallmarked-save//marked를 입력하여 markdown을 htmlnpmins로 변환합니다.

Nginx Proxy Manager에서의 컨테이너 및 마이크로서비스 배포 전략 Nginx Proxy Manager에서의 컨테이너 및 마이크로서비스 배포 전략 Sep 27, 2023 pm 01:06 PM

NginxProxyManager에서 컨테이너 및 마이크로서비스의 배포 전략에는 특정 코드 예제가 필요합니다. 요약: 마이크로서비스 아키텍처의 인기로 인해 컨테이너화 기술은 현대 소프트웨어 개발의 중요한 부분이 되었습니다. 마이크로서비스 아키텍처에서 NginxProxyManager는 마이크로서비스의 트래픽을 관리하고 프록시하는 데 사용되는 매우 중요한 역할을 합니다. 이 문서에서는 NginxProxyManager를 사용하여 컨테이너화된 마이크로서비스를 배포 및 관리하는 방법을 소개하고 관련 코드 예제를 제공합니다.

Vue3에서 아바타를 선택하고 자르는 방법 Vue3에서 아바타를 선택하고 자르는 방법 May 29, 2023 am 10:22 AM

최종 효과는 VueCropper 컴포넌트 Yarnaddvue-cropper@next를 설치하는 것입니다. 위의 설치 값은 Vue2이거나 다른 방법을 사용하여 참조하려는 경우 공식 npm 주소: 공식 튜토리얼을 방문하세요. 컴포넌트에서 참조하고 사용하는 것도 매우 간단합니다. 여기서는 해당 컴포넌트와 해당 스타일 파일을 소개하기만 하면 됩니다. 여기서는 import{userInfoByRequest}from'../js/api만 소개하면 됩니다. 내 구성 요소 파일에서 import{VueCropper}from'vue-cropper&

Nginx 프록시 관리자 튜토리얼: 빠른 시작 가이드 Nginx 프록시 관리자 튜토리얼: 빠른 시작 가이드 Sep 27, 2023 pm 05:39 PM

NginxProxyManager 튜토리얼: 빠른 시작 가이드, 필요한 특정 코드 예제 소개: 네트워크 기술의 발전으로 프록시 서버는 일상적인 인터넷 사용의 일부가 되었습니다. NginxProxyManager는 Nginx 기반의 프록시 서버 관리 플랫폼으로, 프록시 서버를 신속하게 구축하고 관리하는 데 도움이 됩니다. 이 기사에서는 NginxProxyManager의 빠른 시작 가이드와 일부 특정 코드 예제를 소개합니다. 하나

See all articles