Resumen
Proxy y Reflect son API introducidas por ES6 para operar con objetos.
Proxy puedeSobre目marcaobjetodeLeer取、FunciónLa llamadaesperaroperacióndecimalesLínea拦截, entoncesdecimalesLíneaoperaciónmanera.elloNodirectoConectaroperaciónobjeto, mientras queSícomoProxyEl patrón,Medianteobjetodepares de sustitutos象decimalesLíneaoperación,EndecimalesLíneaestosoperacióncuandopuedeañadiruna些requierede额外operaciones. → Proxy puede interceptar operaciones como la lectura y la invocación de funciones en el objeto objetivo, y luego realizar el procesamiento de la operación. No opera directamente sobre el objeto, sino que, como el patrón proxy, opera a través de un objeto proxy del objeto; al realizar estas operaciones, se pueden añadir algunas operaciones adicionales necesarias.
Reflect puedese utiliza para获取目marcaobjetodecomportamiento, elloy Object similar,pero更fácilLeer,ParaoperaciónobjetoProporcionayauna种更Excelente雅de la siguiente. Estode los métodosy Proxy es correctoenviarde. → Reflect se puede utilizar para obtener el comportamiento del objeto objetivo. Es similar a Object, pero más legible, y proporciona una forma más elegante de operar con objetos. Sus métodos se corresponden con los de Proxy.
Uso básico
Proxy
un Proxy objetoRazóndosunidadsección.grupoCheng: target 、 handler 。EnMediante Proxy estructura造Función生ChengEjemplosobjetocuandorequiereProporcionaestodosunidadel parámetro. target es decir目marcaobjeto, handler Es unobjeto,DeclaraciónyaProxy target de指elcomportamiento. → Un objeto Proxy consta de dos partes: target y handler. Al generar un objeto de instancia mediante el constructor de Proxy, se deben proporcionar estos dos parámetros. target es el objeto objetivo, y handler es un objeto que declara el comportamiento específico del proxy de target.
Métodos de instancia → Métodos de instancia
get(target, propKey, receiver)
Se utiliza para la operación de lectura de propKey en el objeto target.
El método get() puede heredarse.
set(target, propKey, value, receiver)
Se utiliza para interceptar la operación de asignación de propKey en el objeto target. Si una propiedad propia del objeto target no es escribible ni configurable, entonces el método set no tendrá efecto.
El cuarto parámetro receiver representa el objeto donde se encuentra el comportamiento de la operación original, generalmente la propia instancia de Proxy.
Nota: en modo estricto, si el proxy set no devuelve true, se producirá un error.
apply(target, ctx, args)
se utiliza para拦截FuncióndeLa llamada、call y reply operaciones.target representa目marcaobjeto,ctx representa目marcaobjetoarribaabajo,args representa目marcaobjetodeParámetrosmatriz.。 → Se utiliza para interceptar las operaciones de invocación de funciones, call y reply. target representa el objeto objetivo, ctx representa el contexto del objeto objetivo y args representa la matriz de argumentos del objeto objetivo.
has(target, propKey)
se utiliza para拦截 HasProperty operación,es decirEn判cortar target objetosiexiste propKey AtributocuandopuedeEdredónEsteMétodo拦截。EsteMétodoNo判cortarunAtributoes correcto象自身deAtributo, tambiénSí继承deAtributo. → Se utiliza para interceptar la operación HasProperty, es decir, cuando se determina si la propiedad propKey existe en el objeto target, será interceptada por este método. Este método no distingue si una propiedad es propia del objeto o heredada.
Nota: este método no intercepta el bucle for ... in.
construct(target, args)
Se utiliza para interceptar el comando new. El valor de retorno debe ser un objeto.
deleteProperty(target, propKey)
Se utiliza para interceptar la operación delete. Si este método lanza un error o devuelve false, la propiedad propKey no podrá ser eliminada por el comando delete.
defineProperty(target, propKey, propDesc)
se utiliza para拦截 Object.defineProsi目marcaobjetoNovarExtensión,Agregar目marcaobjetoarribaNoexistedeAtributopuedemensaje错;siAtributoNovarEscribiroNovarconfiguración,entoncesno puedeModificarcambiarestosAtributo. → Se utiliza para interceptar Object.definePro. Si el objeto objetivo no es extensible, añadir una propiedad que no existe en el objeto objetivo provocará un error; si la propiedad no es escribible ni configurable, no se pueden cambiar estas propiedades.
erty operación → erty operación
getOwnPropertyDescriptor(target, propKey)
Se utiliza para interceptar Object.getOwnPropertyD(). El valor de retorno es un objeto de descripción de propiedad o undefined.
propiedad ptor
getPrototypeOf(target)
Se utiliza principalmente para interceptar operaciones de obtención del prototipo de un objeto. Incluye las siguientes operaciones:
- Object.prototype._proto_ - Object.prototype.isPrototypeOf() - Object.getPrototypeOf() - Reflect.getPrototypeOf() - instanceof
Nota,Valor de retornodebees correcto象o null , de lo contrariomensaje错。Otro外, si目marcaobjetoNovarExtensión(non-extensible),getPrototypeOf MétododebeDevuelve目marcaobjetodeOriginalpaqueteobjeto. → Nota: el valor de retorno debe ser un objeto o null; de lo contrario, se produce un error. Además, si el objeto objetivo no es extensible, el método getPrototypeOf debe devolver el objeto prototipo del objeto objetivo.
isExtensible(target)
Se utiliza para interceptar la operación Object.isExtensible.
Este método solo puede devolver un valor booleano; de lo contrario, el valor de retorno se convertirá automáticamente a booleano.
Nota: su valor de retorno debe ser coherente con la propiedad isExtensible del objeto objetivo; de lo contrario, se lanzará un error.
ownKeys(target)
Se utiliza para interceptar operaciones de lectura de las propiedades propias del objeto. Incluye principalmente las siguientes operaciones:
- Object.getOwnPropertyNames() - Object.getOwnPropertySymbols() - Object.keys() - or...in
Los miembros de la matriz devuelta por el método solo pueden ser cadenas o valores Symbol; de lo contrario, se producirá un error.
Si el objeto objetivo contiene propiedades no configurables, estas propiedades deben devolverse en el resultado; de lo contrario, se producirá un error.
Si el objeto objetivo no es extensible, se deben devolver todas y solo las propiedades que contiene el objeto objetivo; no se pueden incluir propiedades inexistentes; de lo contrario, también se producirá un error.
preventExtensions(target)
Interceptar la operación Object.preventExtensions.
Este método debe devolver un valor booleano; de lo contrario, se convertirá automáticamente a booleano.
setPrototypeOf
Se utiliza principalmente para interceptar el método Object.setPrototypeOf.
El valor de retorno debe ser booleano; de lo contrario, se convertirá automáticamente a booleano.
Si el objeto objetivo no es extensible, el método setPrototypeOf no debe cambiar el prototipo del objeto objetivo.
Proxy.revocable()
Se utiliza para devolver una instancia de Proxy cancelable.
Reflect
ES6 Mediova a Object deuna些明显Atributoqueque en el lenguajedentro部de los métodosmover植llegarya Reflect objetoarriba(actualmenteAlgunosMétodopuedeal mismo tiempoexisteque Object y Reflect objetoarriba),未venirdeNuevoMétodopuede只部署En Reflect objetoArriba. → En ES6, algunos métodos de Object que claramente pertenecen a la parte interna del lenguaje se trasladaron al objeto Reflect (actualmente algunos métodos existen tanto en Object como en Reflect), y los nuevos métodos futuros se implementarán solo en el objeto Reflect.
El objeto Reflect ha modificado los resultados de retorno de algunos métodos para hacerlos más razonables.
El objeto Reflect implementa las operaciones imperativas de Object mediante funciones.
Métodos estáticos
Reflect.get(target, name, receiver)
Busca y devuelve la propiedad name del objeto target.
Reflect.set(target, name, value, receiver)
Establece la propiedad name de target como value. El valor de retorno es boolean; true indica que la modificación fue exitosa, false indica fallo. Cuando target es un objeto inexistente, se producirá un error.
Reflect.has(obj, name)
Sí name in obj DirectivadeFunciónTransformación,se utiliza paraConsultar找 name AtributoEn obj objetoMediosiexiste. Devuelvees boolean. Si obj no esobjetoentoncespuedemensaje错 TypeError. → Es la versión funcional de la instrucción name in obj; se utiliza para comprobar si la propiedad name existe en el objeto obj. El valor de retorno es boolean. Si obj no es un objeto, se lanzará un error TypeError.
Reflect.deleteProperty(obj, property)
Es la versión funcional de delete obj[property]; se utiliza para eliminar la propiedad property del objeto obj. El valor de retorno es boolean. Si obj no es un objeto, se lanzará un error TypeError.
Reflect.construct(obj, args)
Equivale a new target(...args). → Equivale a new target(...args).
Reflect.getPrototypeOf(obj)
Se utiliza para leer la propiedad _proto_ de obj. Cuando obj no es un objeto, a diferencia de Object, no convertirá obj en objeto, sino que se producirá un error.
Reflect.setPrototypeOf(obj, newProto)
Se utiliza para establecer el prototype del objeto objetivo.
Reflect.apply(func, thisArg, args)
Equivalente a Function.prototype.apply.call(func, thisArg, args). func representa la función objetivo; thisArg representa el objeto this al que está vinculada la función objetivo; args representa la lista de parámetros pasados al llamar a la función objetivo, que puede ser un array o un objeto similar a un array. Si la función objetivo no se puede invocar, se lanzará un TypeError.
Reflect.defineProperty(target, propertyKey, attributes)
Se utiliza para definir propiedades en el objeto objetivo. Si target no es un objeto, se lanzará un error.
Reflect.getOwnPropertyDescriptor(target, propertyKey)
Se utiliza para obtener el objeto descriptor de la propiedad propertyKey del objeto target. Cuando target no es un objeto, se lanzará un error indicando que el parámetro no es válido, y no se convertirá el no-objeto en un objeto.
Reflect.isExtensible(target)
Se utiliza para determinar si el objeto target es extensible. El valor de retorno es boolean. Si el parámetro target no es un objeto, se lanzará un error.
Reflect.preventExtensions(target)
Se utiliza para hacer que el objeto target sea no extensible. Si el parámetro target no es un objeto, se lanzará un error.
Reflect.ownKeys(target)
Se utiliza para devolver todas las propiedades del objeto target, equivalente a la suma de Object.getOwnPropertyNames y Object.getOwnPropertySymbols.
Uso combinado
Los métodos del objeto Reflect se corresponden uno a uno con los métodos del objeto Proxy. Por lo tanto, los métodos del objeto Proxy pueden obtener el comportamiento predeterminado llamando a los métodos del objeto Reflect y luego realizar operaciones adicionales.
Ampliación de escenarios de uso
Implementar el patrón observador