이 글은 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 })
이때 origin
과 proxy
가 출력됩니다. proxy
에는 origin
origin
和proxy
,可以发现,proxy
拥有和origin
一样的name
属性
console.log(origin) // {name: 'origin'} console.log(proxy) // Proxy {name: 'origin'}
为origin
添加age
属性,再输出,可以发现,origin
和proxy
都拥有了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'}
可以发现,虽然origin
和proxy
都拥有了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 속성을 입력하고 출력하면 origin
과 proxy
모두에 age
속성이 있는 것을 확인할 수 있습니다let origin={} let proxy=new Proxy(origin,{ getOwnPropertyDescriptor:(target, prop)=>{ throw 'no' } }) Object.getOwnPropertyDescriptor(proxy, 'x') // Uncaught no
proxy
에
isExtensible(target)속성을 추가해 보면
origin
과 proxy
모두 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
에 대한 작업은 >는 그렇지 않습니다. 프록시
와 동기화되며 프록시
에도 자체 동작이 있습니다. 🎜🎜 이렇게 생각하시면 됩니다. proxy
는 origin
의 비서입니다. 모든 거래는 비서에게 제출되어야 하며, 비서는 자신만의 업무 규칙을 가지고 있습니다. 제출을 거부하거나 제출하기 전에 다른 동작을 추가할 수 있습니다. 그렇다면 이 비서는 상사를 대신해 무엇을 할 수 있을까요? 🎜🎜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
: 프록시 객체🎜 getPrototypeOf
: 프로토타입
가져오기🎜🎜🎜🎜구문: 🎜rrreee- 🎜🎜
대상
: 프록시 객체🎜setPrototypeOf
: 프로토타입
설정🎜🎜🎜🎜구문: 🎜rrreee- 🎜🎜
target
: 프록시 객체🎜🎜🎜prototype
: prototype🎜defineProperty
: 속성 설명 설정🎜🎜🎜🎜구문: 🎜rrreee - 🎜🎜
대상
: 프록시 객체🎜🎜🎜 prop
: 설명을 설정하는 속성🎜🎜🎜descriptor
: 설명🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

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

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

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
