찾다
웹 프론트엔드JS 튜토리얼es6의 프록시에 대한 자세한 소개(코드 예)

이 글은 es6의 에이전트에 대한 자세한 소개(코드 예시)를 담고 있습니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

개요

에이전시는 에이전트에게 귀하를 대신하여 무언가를 해달라고 요청하는 것을 의미하지만, 귀하와는 달리 에이전트는 자신만의 행동을 가질 수 있으며 심지어 기대와는 반대로 행동할 수도 있습니다.

Chestnut

은 속성 이름을 갖는 공통 객체 출처를 선언합니다.

let origin={
    name: 'origin'
}

프록시 객체를 선언합니다

let proxy=new Proxy(origin, {
    get: (target, key)=>target[key]+" from proxy",
    set: (target, key, value)=>target[key]="set by proxy "+value
})

이때 originproxy가 출력됩니다. proxy에는 originoriginproxy,可以发现,proxy拥有和origin一样的name属性

console.log(origin) // {name: 'origin'}
console.log(proxy) // Proxy {name: 'origin'}

origin添加age属性,再输出,可以发现,originproxy都拥有了age属性

origin.age=1 
console.log(origin) // {name: 'origin', age: '1'}
console.log(proxy) // Proxy {name: 'origin', age '1'}

那就是代理吗,当然不是,我们尝试为proxy添加属性

proxy.x=1
console.log(origin) // {name: 'origin', age: '1', x:'set by proxy 1'}
console.log(proxy) // Proxy {name: 'origin', age '1'}

可以发现,虽然originproxy都拥有了x属性,但是并不是我们赋值的1,而是多了set by proxy 几个字符串,很明显,这里是执行了初始化proxy时传入的第二个对象的set方法
那如果我们get

console.log(proxy.x) // set by proxy 1
console.log(proxy.x) // set by proxy 1 from proxy

现在很清楚了,proxy就是origin的代理,所有在proxy上的操作都会同步到origin上,而对origin的操作却不会同步到proxy上,而且proxy还有自己的行为。

可以这么想,proxy就是origin的秘书,所有的事务处理都要提交给秘书,秘书有自己的办事准则,可以直接提交给老板,也可以拒绝提交,或者添加一些其他的行为再提交。那这个秘书到底能代理老板做哪些事呢?

陷阱

语法

let p = new Proxy(target, handler);

初始化一个代理需要有两个参数

target:代理目标

handle:陷阱,是一个对象,我们的操作就像一只逃跑的动物,如果猎人在所有可以逃跑的路上全部放满了陷阱,那我们总是会落入一起一个的。本质就是一个对象,键描述我们的操作,值是函数,描述我们的行为,一共有13种陷阱。

0x003 set:设置属性

语法:

set(target, key, value)

target: 代理对象

key: 设置的属性

value: 设置的属性值

栗子:

let origin={}
let proxy=new Proxy(origin,{
    set:(target, key, value)=>{
        if(value>5)target[key]=value+10000
    }
})
proxy.x=1
proxy.y=10
console.log(proxy) // Proxy {y: 10010}
console.log(origin) // {y: 10010}

说明:
上面我们放置了一个set陷阱,当我们做set操作的时候,就会被捕捉到,我们判断value是否大于5,如果不大于5我们就不会做任何东西,但是如果大于5,就会给做赋值操作,并且还将他加上了10000。上面的栗子就相当于一个拦截器了。

 get:访问属性

语法:

get(target, key)

target: 代理对象

key: 访问的属性

栗子:

let origin={
    x:1,
    y:2
}
let proxy=new Proxy(origin,{
    get:(target, key)=>{
        if(key==='x')return 'no'
        return target[key]
    }
})
console.log(proxy.x) // 'no'
console.log(proxy.y) // 2

 deleteProperty:删除属性

语法:

deleteProperty(target, key)

target: 代理对象

key: 要删除的属性

栗子:

let origin={
    x:1,
    y:2
}
let proxy=new Proxy(origin,{
    deleteProperty:(target, key)=>{
        if(key==='x')return
        delete target[key]
    }
})
delete proxy.x
delete proxy.y
console.log(proxy) // {x:1}

has:判断是否包含某属性

语法:

has(target, key)

target: 代理对象

key: 要判断的属性

栗子:

let origin={
    x:1,
    y:2
}
let proxy=new Proxy(origin,{
    has:(target, key)=>{
        if(key==='x')return false
        return true
    }
})
console.log('x' in proxy) // false
console.log('y' in proxy) // true

 ownKeys:获取自身属性值

  • 语法:

    ownKeys(target)
    • target: 代理对象

  • 栗子:

    let origin={
        x:1,
        y:2
    }
    let proxy=new Proxy(origin,{
        ownKeys:(target)=>{
            return ['y']
        }
    })
    console.log(Object.getOwnPropertyNames(proxy)) // ['y']

getPrototypeOf:获取prototype

  • 语法:

    getPrototypeOf(target)
    • target: 代理对象

  • 栗子

    let origin={
        x:1,
        y:2
    }
    let proxy=new Proxy(origin,{
        getPrototypeOf:(target)=>{
            return null
        }
    })
    console.log(Object.getPrototypeOf(p)) // null

setPrototypeOf:设置prototype

  • 语法:

    setPrototypeOf(target, prototype)
    • target: 代理对象

    • prototype: 要设置的prototype

  • 栗子

    let origin={
        x:1,
        y:2
    }
    let proxy=new Proxy(origin,{
        setPrototypeOf:(target, prototype)=>{
            throw 'no'
        }
    })
    Object.setPrototypeOf(proxy, {}) //  Uncaught no

defineProperty :设置属性描述

  • 语法:

    defineProperty(target, prop, descriptor)
    • target: 代理对象

    • prop: 要设置描述的属性

    • descriptor: 描述

  • 栗子

    let origin={}
    let proxy=new Proxy(origin,{
        defineProperty:(target, prop, descriptor)=>{
            throw 'no'
        }
    })
    Object.defineProperty(proxy, 'x', {configurable: true}) //  Uncaught no

getOwnPropertyDescriptor
getOwnPropertyDescriptor(target, prop)

age에 추가하는 것과 동일한 <code>name 속성이 있음을 알 수 있습니다. >origin 속성을 ​​입력하고 출력하면 originproxy 모두에 age 속성이 있는 것을 확인할 수 있습니다
    let origin={}
    let proxy=new Proxy(origin,{
        getOwnPropertyDescriptor:(target, prop)=>{
            throw 'no'
        }
    })
    Object.getOwnPropertyDescriptor(proxy, 'x') //  Uncaught no
  • 그렇죠 물론 그렇지 않습니까? proxy

    isExtensible(target)
    속성을 추가해 보면 originproxy 모두 x 속성은 그렇지 않습니다. 우리가 할당한 1이 아니라 프록시에 의해 설정된 여러 문자열이 분명히 프록시 입력된 두 번째 개체의 set 메서드
    get🎜
    let origin={}
    let proxy=new Proxy(origin,{
        isExtensible:(target)=>{
           return false
        }
    })
    console.log(Object.isExtensible(proxy)); // false
    🎜이제 매우 명확해졌습니다. 프록시는<code>origin의 프록시입니다. proxy에 대한 모든 작업은 origin에 동기화되지만 origin에 대한 작업은 >는 그렇지 않습니다. 프록시와 동기화되며 프록시에도 자체 동작이 있습니다. 🎜🎜 이렇게 생각하시면 됩니다. proxyorigin의 비서입니다. 모든 거래는 비서에게 제출되어야 하며, 비서는 자신만의 업무 규칙을 가지고 있습니다. 제출을 거부하거나 제출하기 전에 다른 동작을 추가할 수 있습니다. 그렇다면 이 비서는 상사를 대신해 무엇을 할 수 있을까요? 🎜🎜Trap🎜🎜Syntax🎜
    preventExtensions(target)
    🎜프록시를 초기화하려면 두 개의 매개변수가 필요합니다🎜🎜target: 프록시 대상 🎜🎜handle: Trap은 객체이고 우리의 작업입니다. 도망가는 동물, 사냥꾼이 가능한 모든 탈출 경로에 함정을 설치하면 우리는 항상 그 중 하나에 빠지게 될 것입니다. 본질적으로 객체이며 키는 작업을 설명하고 값은 동작을 설명하는 함수입니다. 총 13 트랩이 있습니다. 🎜🎜0x003 set: 속성 설정 🎜🎜구문: ​​🎜
    let origin={}
    let proxy=new Proxy(origin,{
        preventExtensions:(target)=>{
            return false;
        }
    })
    console.log(Object.preventExtensions(proxy)); // Uncaught TypeError: 'preventExtensions' on proxy: trap returned falsish
    🎜target: 프록시 객체 🎜🎜key: 속성 설정 🎜🎜: 설정 속성 값 🎜🎜 Chestnut: 🎜
    construct(target, argumentsList, newTarget)
    🎜 설명:
    위에 set 트랩을 배치했습니다. set 작업을 수행하면 캡처됩니다. 5보다 큰지 여부. 5보다 크지 않으면 아무 작업도 수행하지 않지만 보다 큰 경우에는 >5 이면 할당 작업이 수행되고 10000이 추가됩니다. 위의 밤은 인터셉터와 동일합니다. 🎜🎜get: 액세스 속성🎜🎜 구문: 🎜
    let Origin=function(){}
    let OriginProxy=new Proxy(Origin,{
      construct: function(target, argumentsList, newTarget) {
          throw 'error'  
      }
    })
    new OriginProxy() // Uncaught error
    🎜target: 프록시 객체 🎜🎜key: 액세스된 속성 🎜🎜Chestnut: 🎜
    apply(target, thisArg, argumentsList)
    🎜 deleteProperty: 삭제 속성🎜🎜 구문: 🎜
    let origin=function(){}
    let proxy=new Proxy(origin,{
      apply: function(target, thisArg, argumentsList) {
        throw 'error'
      }
    })
    origin() // Uncaught error
    🎜target: 프록시 개체 🎜🎜key: 삭제할 속성 🎜🎜Chestnuts: 🎜rrreee🎜has: 특정 속성이 포함되는지 확인 🎜🎜 구문: 🎜rrreee🎜target: 프록시 객체🎜🎜key: 판단할 속성🎜🎜Chestnut: 🎜rrreee🎜 ownKeys: 자체 속성 값 가져오기 🎜 🎜🎜🎜구문: ​​🎜rrreee
    • 🎜🎜target: 프록시 객체🎜
    🎜🎜Chestnut: 🎜rrreee🎜getPrototypeOf: 프로토타입 가져오기🎜🎜🎜🎜구문: ​​🎜rrreee
      🎜🎜대상: 프록시 객체🎜
    🎜 🎜 밤나무 🎜rrreee🎜setPrototypeOf: 프로토타입 설정🎜🎜🎜🎜구문: ​​🎜rrreee
      🎜🎜target: 프록시 객체🎜🎜🎜prototype: prototype🎜
    🎜🎜Chestnut🎜rrreee🎜defineProperty : 속성 설명 설정🎜🎜🎜🎜구문: ​​🎜rrreee
      🎜🎜대상: 프록시 객체🎜🎜🎜 prop: 설명을 설정하는 속성🎜🎜🎜descriptor: 설명🎜
    🎜🎜Chestnut🎜rrreee ul> 🎜getOwnPropertyDescriptor : 자체 속성 설명 가져오기🎜🎜🎜🎜구문: ​​🎜
    getOwnPropertyDescriptor(target, prop)
    • target: 代理对象

    • prop: 获取描述的属性

  • 栗子

    let origin={}
    let proxy=new Proxy(origin,{
        getOwnPropertyDescriptor:(target, prop)=>{
            throw 'no'
        }
    })
    Object.getOwnPropertyDescriptor(proxy, 'x') //  Uncaught no
  • isExtensible:判断是否可扩展

    • 语法:

      isExtensible(target)
      • target: 代理对象

    • 栗子

      let origin={}
      let proxy=new Proxy(origin,{
          isExtensible:(target)=>{
             return false
          }
      })
      console.log(Object.isExtensible(proxy)); // false

    preventExtensions :阻止扩展

    • 语法:

      preventExtensions(target)
      • target: 代理对象

    • 栗子:

      let origin={}
      let proxy=new Proxy(origin,{
          preventExtensions:(target)=>{
              return false;
          }
      })
      console.log(Object.preventExtensions(proxy)); // Uncaught TypeError: 'preventExtensions' on proxy: trap returned falsish

    construct:构造

    • 语法:

      construct(target, argumentsList, newTarget)
      • target: 代理对象

      • argumentsList: 参数列表

      • newTarget: 新对象

    • 栗子:

      let Origin=function(){}
      let OriginProxy=new Proxy(Origin,{
        construct: function(target, argumentsList, newTarget) {
            throw 'error'  
        }
      })
      new OriginProxy() // Uncaught error

    apply:调用

    • 语法:

      apply(target, thisArg, argumentsList)

      target: 代理对象

      thisArg: 上下文

      argumentsList: 参数列表

    • 栗子:

      let origin=function(){}
      let proxy=new Proxy(origin,{
        apply: function(target, thisArg, argumentsList) {
          throw 'error'
        }
      })
      origin() // Uncaught error



    위 내용은 es6의 프록시에 대한 자세한 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    es6怎么判断是否为数组es6怎么判断是否为数组Apr 25, 2022 pm 06:43 PM

    在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

    es6中遍历跟迭代的区别是什么es6中遍历跟迭代的区别是什么Apr 26, 2022 pm 02:57 PM

    es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

    es6中怎么判断两个对象是否相等es6中怎么判断两个对象是否相等Apr 19, 2022 pm 03:34 PM

    在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

    es6怎么将数字转为字符串es6怎么将数字转为字符串Apr 19, 2022 pm 06:38 PM

    转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

    es6中assign的用法是什么es6中assign的用法是什么May 05, 2022 pm 02:25 PM

    在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

    es6怎么改变数组数据es6怎么改变数组数据Apr 26, 2022 am 10:08 AM

    改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。

    sort排序是es6中的吗sort排序是es6中的吗Apr 25, 2022 pm 03:30 PM

    sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

    import as在es6中的用法是什么import as在es6中的用法是什么Apr 25, 2022 pm 05:19 PM

    在es6中,import as用于将若干export导出的内容组合成一个对象返回;ES6的模块化分为导出与导入两个模块,该方法能够将所有的导出内容包裹到指定对象中,语法为“import * as 对象 from ...”。

    See all articles

    핫 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를 무료로 생성하십시오.

    뜨거운 도구

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

    mPDF

    mPDF

    mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

    Atom Editor Mac 버전 다운로드

    Atom Editor Mac 버전 다운로드

    가장 인기 있는 오픈 소스 편집기