This article brings you a detailed introduction (code example) about the agent in es6. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you. help.
Overview
Agency means asking an agent to do something on your behalf, but unlike yourself, the agent can have his own behavior, and can even do things that go against expectations. the behavior of.
Chestnut
Declare a common object origin, which has an attribute name
let origin={ name: 'origin' }
Declare a proxy object
let proxy=new Proxy(origin, { get: (target, key)=>target[key]+" from proxy", set: (target, key, value)=>target[key]="set by proxy "+value })
Output at this timeorigin
and proxy
, you can find that proxy
has the same name
attribute as origin
console.log(origin) // {name: 'origin'} console.log(proxy) // Proxy {name: 'origin'}
is origin
Add the age
attribute, and then output it. You can find that both origin
and proxy
have the age
attribute
origin.age=1 console.log(origin) // {name: 'origin', age: '1'} console.log(proxy) // Proxy {name: 'origin', age '1'}
Is that a proxy? Of course not, we try to add attributes to proxy
proxy.x=1 console.log(origin) // {name: 'origin', age: '1', x:'set by proxy 1'} console.log(proxy) // Proxy {name: 'origin', age '1'}
and we can find that although origin
and proxy
They all have the x
attribute, but it is not the 1
we assigned, but a few more strings set by proxy
. Obviously, this is executed The set
method of the second object passed in when initializing proxy
So what if we get
console.log(proxy.x) // set by proxy 1 console.log(proxy.x) // set by proxy 1 from proxy
is now clear , proxy
is the proxy of origin
, all operations on proxy
will be synchronized to origin
, and for origin# The operations of ## will not be synchronized to
proxy, and
proxy also has its own behavior.
proxy is the secretary of
origin. All transactions must be submitted to the secretary. The secretary has his own rules for doing things and can submit them directly to the boss. , you can also reject the submission, or add some other behaviors before submitting. So what can this secretary do on behalf of the boss?
let p = new Proxy(target, handler);Initializing a proxy requires two parameters
target: proxy target
handle: A trap is an object. Our operation is like an escaping animal. If the hunter places all the traps on all the ways to escape, then we will always fall into one together. . The essence is an object, the key describes our operation, the value is the function, describes our behavior, there are a total of
13 traps.
set:Set attributes
Syntax:
set(target, key, value)
target: Proxy object
value: Set attribute 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}Explanation:
We placed a
set above Trap, when we do the
set operation, it will be caught. We judge whether
value is greater than
5, if not greater than
5We will not do anything, but if it is greater than
5, we will perform an assignment operation and add
10000. The chestnut above is equivalent to an interceptor.
get: access attribute
Syntax:get(target, key)
target: proxy object
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: Delete properties
Syntax:deleteProperty(target, key)
target: Proxy object
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: Determine whether a certain attribute is included
Syntax:has(target, key)
target: Proxy object
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: Get own attribute value
- Syntax:
ownKeys(target)
- ##target
: Proxy object
-
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ ownKeys:(target)=>{ return ['y'] } }) console.log(Object.getOwnPropertyNames(proxy)) // ['y']
:Get prototype
- Syntax:
-
getPrototypeOf(target)
- target
: Proxy object
-
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ getPrototypeOf:(target)=>{ return null } }) console.log(Object.getPrototypeOf(p)) // null
:Set prototype
- Syntax:
-
setPrototypeOf(target, prototype)
- target
: Proxy object
- prototype
: The
prototype
to be set
-
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ setPrototypeOf:(target, prototype)=>{ throw 'no' } }) Object.setPrototypeOf(proxy, {}) // Uncaught no
: Set property description
- Syntax :
-
defineProperty(target, prop, descriptor)
- target
: Proxy object
- prop
: To set the description Properties
- descriptor
: description
-
let origin={} let proxy=new Proxy(origin,{ defineProperty:(target, prop, descriptor)=>{ throw 'no' } }) Object.defineProperty(proxy, 'x', {configurable: true}) // Uncaught no
:Get own property description
- Syntax:
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
The above is the detailed content of Detailed introduction to proxies in es6 (code example). For more information, please follow other related articles on the PHP Chinese website!

在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 ...”。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Atom editor mac version download
The most popular open source editor

Dreamweaver Mac version
Visual web development tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.
