Apuntes de la clase:
Introducción
¿Qué significa ser un profesional de JavaScript?
Aspectos que destacan a un profesional
Inicio del proyecto
Repaso de Conceptos Fundamentales
Cómo llega un script al navegador
Scope
Closures
El primer plugin
this
Los métodos call, apply y bind
Prototype
Herencia Prototipal
Cómo funciona JavaScript
Parsers y el Abstract Syntax Tree
Abstract Syntax Tree en Práctica
Cómo funciona el JavaScript Engine
Event Loop
Fundamentos Intermedios
Promesas
Getters y setters
Fundamentos Avanzados
Proxy
Generators
APIs del DOM
Fetch - Cómo cancelar peticiones
IntersectionObserver
VisibilityChange
Service Workers
TypeScript
Introducción
Tipos básicos
Funciones
Interfaces
Clases
Convertir el proyecto a TypeScript
Patrones de Diseño
Qué es un patrón de diseño
Categorías de patrones de diseño
Patrón Singleton y Casos de Uso
Implementación del patrón Singleton
¿Cómo funciona el Patrón Observer?
Implementación del patrón Observer
Casos de Uso del patrón Observer: Redux
Patrón Decorator y Casos de Uso
Implementación del patrón Decorator
Proyecto: MediaPlayer
Implementación de plugin de Ads: Desplegando en consola
Implementación de plugin de Ads: Desplegando en pantalla
Publicar en npm
Conclusiones
Conclusiones
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
El proxy sirve para interceptar la lectura de propiedades de un objeto (los get, y set) entre muchas otras funciones. Así, antes de que la llamada llegue al objeto podemos manipularla con una lógica que nosotros definamos.
Aportes 121
Preguntas 16
Apuntes de la clase:
Sé que no es una aplicación muy ortodoxa pero la comparto:
const dialogosRamirez = {
accion: "Para saber si es cocaina enviaremos una muestra al laboratorio",
sugerencia: "¿Seguro no quiere esperar a los analisis de laboratorio?",
pregunta: "¿Y supo si era o no cocaina?"
}
const dialogosComandante = {
get(obj, prop) {
switch (prop) {
case "accion":
console.log(obj[prop])
console.log("Que muestra ramirez que muestra?")
break
case "sugerencia":
console.log(obj[prop])
console.log("Ahorita vemos que onda... ahorita vemos que pe...")
break
case "pregunta":
console.log(obj[prop])
console.log("Nel... no es coca... es harina... ay papaya de celayaaaa, ay papantla tus hijos vuelan!!! VAMONOS PE...!!!")
break
default:
console.log("Que se armen los p$%·% ch%&/zos!!! PUM!!!!")
break
}
return obj[prop]
}
}
const oficialRamirez = new Proxy(dialogosRamirez, dialogosComandante);
Les dejo el codigo que usaremos en clase:
<html>
<head>
<title>Proxy</title>
</head>
<body>
<a href="/ejercicios/">Go back</a>
<p><em>Abre la consola</em></p>
<script src="https://unpkg.com/[email protected]/levenshtein.js"></script>
<script>
// Proxy es parecido a getters y setters
// Usa un concepto que se llama traps: son interceptores de llamadas. A diferencia de getters, no opera sobre una propieda, si no sobre un objeto.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#Methods_of_the_handler_object
// Creemos un ejemplo donde interceptamos llamadas para leer una propiedad
// Si la propiedad existe, la regresamos
// Si no existe, entonces sugerimos una que pueda funcionar
// Para eso eso vamos a usar un algoritmo que se llama Levenshtein. (window.Levenshtein.get)
// Ejemplos de levenshtein distance (usa window.Levenshtein)
</script>
</body>
</html>
me sirvio mucho para reforzar y entender mejor el concepto:
https://www.youtube.com/watch?v=0o4-TvTkGtk
Les dejo el link de levenshtein: https://unpkg.com/[email protected]/levenshtein.js
El objeto Proxy se usa para definir un comportamiento personalizado para operaciones fundamentales (por ejemplo, para observar propiedades, cuando se asignan, enumeración, invocación de funciones, etc).
El objeto controlador es un objeto marcador de posición que contiene trampas para Proxy
.
Todas las trampas son opcionales. Si no se ha definido una trampa, el comportamiento predeterminado es reenviar la operación al objetivo.
Una trampa para obtener valores de propiedad.
var p = new Proxy(target, {
get: function(target, property, receiver) {
}
});
Los siguientes parámetros se pasan al get
método. this
está vinculado al controlador.
target
El objeto de destino.
property
El nombre o Symbol
de la propiedad a obtener.
receiver
El proxy o un objeto que hereda del proxy.
El get
método puede devolver cualquier valor.
const monster1 = {
secret: 'easily scared',
eyeCount: 4
};
const handler1 = {
get: function(target, prop, receiver) {
if (prop === 'secret') {
return `${target.secret.substr(0, 4)} ... shhhh!`;
} else {
return Reflect.get(...arguments);
}
}
};
const proxy1 = new Proxy(monster1, handler1);
console.log(proxy1.eyeCount);
// expected output: 4
console.log(proxy1.secret);
// expected output: "easi ... shhhh!"
El método Object.keys()
devuelve un array de las propiedades names
de un objeto, en el mismo orden como se obtienen en un loop normal.
Object.keys
devuelve un array cuyos elementos son strings correspondientes a las propiedades enumerables que se encuentran directamente en el object. El orden de las propiedades es el mismo que se proporciona al iterar manualmente sobre las propiedades del objeto.
El método **find()**
devuelve el valor del primer elemento del array que cumple la función de prueba proporcionada. En cualquier otro caso se devuelve undefined
.
Ir a la navegaciónIr a la búsqueda
La distancia de Levenshtein, distancia de edición o distancia entre palabras es el número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra, se usa ampliamente en teoría de la información y ciencias de la computación. Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter. Esta distancia recibe ese nombre en honor al científico ruso Vladimir Levenshtein, quien se ocupó de esta distancia en 1965. Es útil en programas que determinan cuán similares son dos cadenas de caracteres, como es el caso de los correctores ortográficos.
casi
Otra gran utilidad de los Proxy son la validación de datos, podemos usarlos como piezas intermedias para controlar ingeniosamente las posibles entradas del usuario.
https://es.wikipedia.org/wiki/Distancia_de_Levenshtein
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Proxy
Cuando escriben una arrow function no hace falta hacer el return si solo se va a ejecutar una linea de codigo, basta con sacarle los corchetes y ponerlo en la misma linea.
const suggestion = Object.keys(obj).find(key => Levenshtein.get(key, prop) <= 3)
Dejo un apunte mas detallado acerca del ejemplo visto en clase
// target es mi objeto a supervisar (sus propiedades pueden ser objetos, array, funciones, u otro proxy)
const target = {
red: 'Rojo',
blue: 'Azul',
green: 'Verde'
}
// handler es un objeto con funciones (trampa) que definen las acciones a seguir cuando se accede al objeto supervisado
const handler = {
// get es una función que recibe el objeto supervisado y la propiedad a la que se quiere acceder
get(objeto, propiedad) {
if (propiedad in objeto) {
// si la propiedad existe, pues retornamos su valor
return objeto[propiedad]
}
// Si llega hasta aqui, significa que la propiedad invocada sobre el objeto no existe, por tanto, vamos a ver si podemos retornar una sugerencia
const sugerencia = Object.keys(objeto).find(key => {
// creo un objeto con todas mis claves del objeto supervisado, y retorno aquella (nombre) que su distancia sea <= 3 tomando como base la propiedad invocada
return Levenshtein.get(key, propiedad) <= 3
})
if (sugerencia) {
console.log(`${propiedad} no se encontró, Quizá tu querías decir ${sugerencia}`)
}
// RETORNAMOS EL VALOR DE LA PROPIEDAD INEXISTENTE (por buenas prácticas)
return objeto[propiedad]
}
}
// 1. Proxy() es un constructor (que siempre debe utilizarse con new) que recibe dos parámetros:
// targer: un objeto sobre el cual se producirá la supervisión
// handler: un objeto con una serie de manejadores para cada una de las diferentes operaciones que se realizarán sobre el objeto pasado en el primer parámetro
// 2. Este constructor devuelve el objeto pasado como parámetro, pero que está siendo interceptado. Es importante tener en cuenta que Proxy() no copia el objeto, devuelve el mismo objeto, pero supervisado.
const p = new Proxy(target, handler)
console.log(p.red)
console.log(p.res)
Los proxys es una herramienta muy potente. Lástima que nos quedemos solo en una introducción. Os paso un enlace de un blog con apuntes de JS https://www.todojs.com/introduccion-a-proxy-de-es6/
Buena Clase!!
El Proxy es servidor que hace como intermediario en las peticiones de recursos que realiza un cliente a otro servidor!
Levenshtein= Es un algoritmo que va a encontrar la distancia entre dos cadenas!!!
La neta siempre me había preguntado como lograba git o npm hacer sugerencias cuando erraba un comando, increíble los Proxys. Aquí mi definición:
** Los Proxys nos permiten interceptar llamadas a las propiedades de objetos para evaluar si estan siendo correctamente referenciadas**
Si bien la temática importante de la clase no es la sugerencia en sí sino el uso de Proxy, encontré un inconveniente en el código que genera dicha sugerencia.
Solo devuelve la primer propiedad que cumple con la distancia Levenshtein, lo que implica que dependiendo el orden que tengan dentro de target es la sugerencia que ofrecerá, ignorando si es que hay más opciones que cumplen con la condición.
Hice una variante del ejemplo para que se sugieran todas las propiedades que cumplan con la distancia Levenshtein requerida.
const target = {
green: 'Verde',
red: 'Rojo',
blue: 'Azul',
}
const handler = {
get(obj, prop) {
if (prop in obj) {
return obj[prop]
}
const suggestions = []
for (const key in obj) {
if (Levenshtein.get(key, prop) <= 3) {
suggestions.push(key)
}
}
if (suggestions.length) {
console.log(
`${prop} no se encuentra. Quisiste decir alguna de las siguientes opciones?`
)
suggestions.forEach((suggestion) => {
console.log(suggestion)
})
} else {
console.log(
`${prop} no se encuentra y no tengo sugerencias para ofrecer.`
)
}
return obj[prop]
},
}
const p = new Proxy(target, handler)
Alguien sabe por qué retorna obj[prop] y no obj.prop? Por qué lo escribe así? yo entiendo que obj es el objeto target y prop es la propiedad que se busca. Entonces, para buscar una propiedad dentro de un objeto acaso no se escribe “obj.prop”?
Proxy usando set, un ejemplo donde se controla que la propiedad edad de una persona sea mayor a 18 años.
const objPersona = {
nombre:'Federico',
apellido:'Herrera',
edad:0
}
const handler = {
set(obj,prop,value){
if(prop === 'edad' && value < 18){
return console.log(`La persona debe ser mayor de edad`)
}else{
return obj.prop = value;
}
}
}
const proxyPersona = new Proxy(objPersona,handler2)
proxyPersona.edad =15;
proxyPersona.edad=20;```
Hola! comparto una implementación para el método Set:
<script>
const target = {
red: "rojo",
green: "verde",
blue: "azul"
};
const handler = {
get: function(obj, prop) {
if (prop in obj) {
return obj[prop];
}
const suggestion = Object.keys(obj).find(
key => Levenshtein.get(key, prop) <= 3
);
if (suggestion) {
console.log(
`${prop} no se encontró. Quisiste decir ${suggestion}`
);
}
return obj[prop];
},
set: function(obj, prop, value) {
if (prop === "black") {
if (value === "negro") {
obj[prop] = value;
} else {
console.log(
`${prop} no puede tener el valor "${value}" tiene que ser "negro"`
);
}
}
}
};
const p = new Proxy(target, handler);
</script>
Como complemento a la clase, en javascript existe un objeto llamado “Reflect” el cual simplifica la creación de un proxy.
Un ejemplo sencillo seria:
let user = {};
Reflect.set(user, 'name', 'John');
alert(user.name); // John
En el siguiente enlace pueden encontrar más información sobre proxy y reflect: https://javascript.info/proxy
Les comparto mi ejercicio 😊, también le agregué el handler set
<script src="https://unpkg.com/[email protected]/levenshtein.js"></script>```
Si desean complementar 🤓
https://www.youtube.com/watch?v=gZ4MCb2nlfQ
El algoritmo de Levenshtein es algo parecido al de hamming para secuencias de ADN y ARN
muy interesante, espero luego ver ese proxy en accion en un proyecto pq sino se borrara de mi mente
en la linea 36
Levenshtein.get(key, prop) <= 3
si quieren que les cambie a ese signo del profesor deben usar la font “fira code” en vsc y tambien podran ver la flecha al escribir la arrow function
para mas info https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions
Entre mas aprendo mas emocionado estoy.
, este devuelve el valor del array que cumpla cierta condicion… Creo que apartir de hoy no se me olvida 😄
Me gusta mucho esto de los Proxy, me da muchas ideas para implementarlo. Ahora hay que aprender mas acerca de él.
Comparto los apuntes de la clase.
/* Trabajando con Proxy, es una clase. Por lo que hay que instanciarlo
recibe dos parametros:
target --> Es el objeto a interceptar.
handler --> Son las "trampas" o la funcion que se ejecuta cuando se intercepte
el target
*/
const target = {
red: 'Rojo',
green: 'Verde',
blue: 'Azul'
}
const handler = {
get(obj, prop){
// Comprobar que la propiedad se encuentre en el objeto
if(prop in obj){
return obj[prop]
}
// Mirar cual es la key que el usuario estaba buscando
// Fin devuelve el valor del array que cumple cierta condicion
const sugerencia = Object.keys(obj).find(key => {
return Levenshtein.get(key, prop) <= 3;
})
// Un string con contenido se evalua a true
if(sugerencia){
console.log(`${prop} no se encontró. Quisiste decir ${sugerencia}?`);
}
// Una funcion debe devolver un valor que no sea undefined, la mayoria de las veces
return obj[prop];
}
}
const p = new Proxy(target, handler);```
Cambie un poco el codigo del ejemplo para que diera mas de una sugerencia, con esto si tenes colores como “blueHard” dara mas de una sugerencia
const target = {
red: 'Rojo',
green: 'verde',
blue: 'Azul',
blueHard: 'Azul Fuerte'
}
const handler = {
get(obj, prop) {
if (prop in obj){ return obj[prop]}
const suggestions_list = [];
const suggestions = Object.keys(obj).map(key=>{
let sdist = Levenshtein.get(key, prop);
if (sdist <= 3) {
suggestions_list.push(key)
}
});
if (suggestions_list.length > 0) {
console.log(`No conozco el valo ${prop}, tal vez te referiste a alguno de estos`);
console.table(suggestions_list);
}
return obj[prop];
}
}
const proxy = new Proxy(target, handler);```
Que lastima que el aporte más votado sean apuntes para entender lo que el profe está haciendo y que la fuente de sus apuntes sean tambien clases de Youtube, esto dice mucho de lo dificil de entender al profe y que hay que buscar fuentes externas porque quedan muchos huecos. Ojala salga una version más didactica de este curso porque voy a menos de la mitad de todo el curso y siento que me quedan mas dudas que aprendizajes
alguien sabe en que contexto se puede utilizar proxys? no se me ocurre alguno 😕
Me gusto el ejercicio pero creo que seria mejor que usaramos un filter en vez de un find, ya que puede que haya mas de un match. Y el find solo retorna un valor, mientras que el filter retorna un array
const target = {
red: "Rojo",
reda: "Reda",
blue: "Azul",
green: "Verde"
};
const handler = {
get(obj, prop) {
if (obj[prop]) {
return obj[prop];
}
const suggestion = Object.keys(obj).filter(
(item) => Levenshtein.get(prop, item) < 3
);
if (suggestion.length > 0) {
console.log(`Did you mean ${suggestion} ?`);
}
}
};
const p = new Proxy(target, handler);
const target = {
red: 'Rojo',
green: 'Verde',
blue: 'Azul'
}
const handler = {
get(obj,prop){
if(prop in obj){
return obj[prop];
}
const suggestion = Object.keys(obj).find(key => {
return Levenshtein.get(key,prop) <= 3
})
if (suggestion){
console.log(`${prop} no se encontro, Quisiste decir ${suggestion}?`)
}
return obj[prop];
}
}
const p = new Proxy(target, handler)
Hola compañeros, vi este video para poder complementar unas dudas que me quedaron de la clase 😄 https://www.youtube.com/watch?v=7njrLMJgDtQ
No entiendo porque el proxy lo declara así , si la documentación le manda tres elementos y entiendo que incluso la forma en que el la declara dice que no es correcta , alguien que me de más luz?
Hice lo mismo que Richard solamente que le agrega comandos que quisiera agregar en mi terminal xd
const persona2 = {
name: "",
lastname: "",
age: 0
}
const handler2 = {
set (obj, prop, value){
if(Object.keys(obj).indexOf(prop)===-1){
return console.error(`la propiedad ${prop} no existe`)
}
obj[prop] = value
}
};
const proxy2 = new Proxy(persona2, handler2);
proxy2.name = "jose"
proxy2.lastname = "barboza"
proxy2.twitter = "@barbozagonza" //..no existe en persona2, veremos el work del handler
proxy2.age = 0
console.log(proxy2)
Veamos si entendí: El proxy actúa sobre la estructura de datos “objeto” en JavaScript. hay varias trampas según la operación que queramos hacer sobre el objeto target.
Todo claro, exceptuando el porqué retorna obj[prop]. Alguien me puede ayudar?
El objeto Proxy se usa para definir un comportamiento personalizado para operaciones fundamentales (por ejemplo, para observar propiedades, cuando se asignan, enumeración, invocación de funciones, etc).
Métodos del objeto handlerSección
El objeto controlador es un objeto marcador de posición que contiene trampas para Proxy.
Todas las trampas son opcionales. Si no se ha definido una trampa, el comportamiento predeterminado es reenviar la operación al objetivo.
handler.get()
Una trampa para obtener valores de propiedad.
muy bueno
ALGUIEN TIENE ALGUNA TRAP DE PROXY aparte de get
que quiera compartir?
Levenshtein distance este es una buena tecnica
no es libreria es Biblioteca
esto se podría utilizar como un paso ejemplo para saber si el usuario tiene permiso de hacer un get del objeto no ?
Este curso está mágico !
En qué momento es recomendable usar los Proxy??
El proxy sirve para interceptar la lectura de propiedades de un objeto (los get, y set) entre muchas otras funciones. Así, antes de que la llamada llegue al objeto podemos manipularla con una lógica que nosotros definamos.
comparto un PROXY --SET muy interesante
let validator = {
set: function(obj, prop, value) {
if (prop === ‘age’) {
if (!Number.isInteger(value)) {
throw new TypeError(‘The age is not an integer’);
}
if (value > 200) {
throw new RangeError(‘The age seems invalid’);
}
}
// The default behavior to store the value
obj[prop] = value;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age); // 100
person.age = ‘young’; // Throws an exception
person.age = 300; // Throws an exception
Excelente clase. Hay muchas situaciones prácticas en las que poder utilizar los Proxy, así que es una genial herramienta.
A alguien se le ocurre algún ejemplo de un caso más real?
Super útil para una mejor interacción con el usuario!
Me pareció muy interesante esta clase
Proxy… nueva clase por explorar!
Creo que esto sera muy útil a la hora de realizar buscadores, podríamos implementarlo en platzi vídeo
Que increible!
Muy util este concepto de proxy, aunque un poco complicado de entender sobretodo si se desea utilizar un array como target.
Para esto, les comparto este articulo para reforzar un poco este concepto
how to use proxies
Increible los proxy en JS.
Wow,Que interesante ! 😮
Excelente explicación, me gusto mucho esta clase.
Un video para ampliar un poco sobre el tema: Proxy en javascript
Desconocía por completo este concepto 😮
OMG…
Estoy flippando jajaja
😄
Qué cool es proxy.
Woooow
Excelente explicación !
esto de los proxys esta genial, esta es como la tercera vez que veo este tema ya que literal quiero bajarlo al 100
Para roforzar un poco acerca de Proxy:
enlace
Me marca un error, Levenshtein no esta definido
Esto debe ser util para los motores de búsqueda también. O por lo menos me lo imagino así en principio
Wow!, se me ocurren muchas situaciones donde pude haber implementado los proxys, a partir de ahora todos mis proyectos tendrán suggestions xD
· Target ─ Es un objeto para envolver, puede ser cualquier cosa, incluidas las funciones.
· Handlers ─ Configuración de proxy: un objeto con “trampas” (métodos que interceptan operaciones) que definen el comportamiento.
p.e:
_get (traer)_ "la trampa" para leer una propiedad de target
_set (setear)_ "la trampa" para escribir una propiedad en target, y así sucesivamente.
Complementando un video de proxy
proxy recibe un target y un handler. El handler es un objeto que contiene funciones 'trap'. Aqui podremos hacer lógicas antes de mostrarle el resultado al usuario.
estannueva caracteristica es bien interesante
Como tio ben diria usa Proxy con responsabilidad. Porque esto es una capa dinámica sobre otra capa dinámica
Genial forma de crear las ayudas
Me pregunté cual era la diferencia de usar “in” y "hasOwnProperty"
y encontre esto post
Proxy en español apoderado es un objeto en JS que nos ayuda a vigilar las operaciones que se hagan con el target.
El target es otro objeto o variable que le indiquemos
La manera en las que los va a vigilar es con el handler que es un objeto con las trampas que queremos poner
Las trampas son el lugar en el que se va a verificar , por ejemplo el get es una trampa cuando se obtiene el valor y el set cuando se asigna, dentro de estas trampas haremos la lógica a vigilar o manejar.
Se genera con la palabra reservada de las trampas por ejemplo get(objeto, atributo){}, los parámetros que reciben dependen del tipo de trampa. Estas trampas pertenecen al objeto handler
Aquí la documentación de este objeto: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler
Buna clase!
script inicial
<html>
<head>
<title>Proxy</title>
</head>
<body>
<a href="/ejercicios/">Go back</a>
<p><em>Abre la consola</em></p>
<script src="https://unpkg.com/[email protected]/levenshtein.js"></script>
<script>
// Proxy es parecido a getters y setters
// Usa un concepto que se llama traps: son interceptores de llamadas. A diferencia de getters, no opera sobre una propieda, si no sobre un objeto.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#Methods_of_the_handler_object
// Creemos un ejemplo donde interceptamos llamadas para leer una propiedad
// Si la propiedad existe, la regresamos
// Si no existe, entonces sugerimos una que pueda funcionar
// Para eso eso vamos a usar un algoritmo que se llama Levenshtein. (window.Levenshtein.get)
// Ejemplos de levenshtein distance (usa window.Levenshtein)
</script>
</body>
Si el valor no se encuentra en el objeto, vamos a retornar un numero 37:
const handler = {
get: function(obj, prop) {
// return: Se encuentra esa propiedad en los objetos?
return prop in obj ?
// Si... esta es la propiedad
obj[prop] :
// No... 37!
37;
}
};
const p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;
console.log(p.a, p.b);
// 1, undefined
console.log('c' in p, p.c);
// false, 37
Para los que no saben que onda con el src que utiliza el prof. sparragus para Levenshtein les dejo este link.
https://unpkg.com/
Básicamente, con UNPKG nos evitamos tener que instalar una librería a través de NPM.
En su documentación explica fácilmente como usar UNPKG.
Básicamente es usar la siguiente sintaxis en tu src.
https://unpkg.com/:package@:version/:file
En este caso:
https://unpkg.com/fast-levenshtein@2.0.6/levenshtein.js
Espero les sirva para agilizar su proceso y entender que hay detrás del link que utiliza el profe en la clase.
No use Levenshtein distance, en su lugar cree una funcion muy simple y basica que regresa un numero que representa el nivel de parcido de dos cadenas de caracteres.
En fin, no importa, la clase trata del uso de Proxy.
Aqui mi humilde codigo.
Js Proxy Example
in
const empleador = {
nombre: "luis" };
console.log(nombre in persona) // TRUE
//¿existe la propiedad nombre en el objeto persona?
console.log(toString in persona.nombre) // TRUE
// también podemos usar "toString" para preguntar si hay una línea de texto
object.key
const empleados = {
nombre: "Luis",
edad: "20",
};
console.log(empleador.key) // [nombre, edad]
// devuelve un array con los key del arreglo
.find
const num = [10, 15, 0, 8]
num.find(numero => numero == 0) //devolvera solamente los numeros iguales a 0,
// una vez lo encuentre se detendrá
ahora sí
<h3>Proxy</h3>Para crear un proxy usamos new Proxy(objetos, handle)
donde objeto va a ser lo que vamos a interrumpir y handle que va a hacer con los valores
Handle es la lógica del proxy, que debo hacer con esto que intercepte, en sí handle tiene varias funciones que nos ayudan aquí usaremos get
Que no es lo mismo que getter
const handler = {
get(target, property){ // le pasamos un objetivo a inspecionar y la propiedad que
// debe inspeccionar, el objetivo el arrgelo la propidad el nombre
if(property in target){ // si esta propiedad existe dentro del target
return target[property] // no hagas nada
}
const sugerencia = Object.keys(target) // si no traeme las key del target
sugerencia.find(key => key.Levenshtime =< 3) // y dentro de sus key vas a buscar
// un elemento muy parecido
} if(sugerencia) {
console.log(`no quisuste decir ${sugerencia} ?`
}
Supongamos que creamos una arreglo y dentro tiene una función que devuelve 2 valores el nombre y apellido
let person = {
name:'Miguel',
last_name:'Soler',
age:28,
languages:['js','css','react'],
fullName: function (){
return `${this.name} ${this.last_name}`
}
}
console.log(person.fullName())
Pero esta no es la forma correcta ya que gette y setter mantiene la semantica es mucho màs transparente y mantiene mejor la integridad de la data
let person = {
name:'Miguel',
last_name:'Soler',
age:28,
languages:['js','css','react'],
get fullName(){
return `${this.name} ${this.last_name}`
}
}
console.log(person.fullName)
Se llama como si fuera un objeto mas
Los setter en vez de sacar datos del arreglo estos reciben datos y los ponen dentro del mismo
let persona = {
nombre: 'Yeison',
apellido: 'Daza',
get nombreCompleto() {
return `${nombre} ${apellido}`
},
set nombreCompleto(nom) {
const palabras = nom.split(' '); // Dividimos el string en 2
this.nombre = palabras[0] || ''; //agarra el valor 0
this.apellido = palabras[1] || ''; // agarra el valor 1
}
}
persona.nombreCompleto = 'Camilo Sanchez' // apesar que es una función esta no se
// llama como una ya que dirá que no esta definida
console.log(persona.nombre); //camilo
console.log(persona.apellido); //sanchez
Setter no puede tener mas de un parámetro
in
const empleador = {
nombre: "luis" };
console.log(nombre in persona) // TRUE
//¿existe la propiedad nombre en el objeto persona?
console.log(toString in persona.nombre) // TRUE
// también podemos usar "toString" para preguntar si hay una línea de texto
object.key
const empleados = {
nombre: "Luis",
edad: "20",
};
console.log(empleador.key) // [nombre, edad]
// devuelve un array con los key del arreglo
.find
const num = [10, 15, 0, 8]
num.find(numero => numero == 0) //devolvera solamente los numeros iguales a 0,
// una vez lo encuentre se detendrá
ahora sí
<h3>Proxy</h3>Para crear un proxy usamos new Proxy(objetos, handle)
donde objeto va a ser lo que vamos a interrumpir y handle que va a hacer con los valores
Handle es la lógica del proxy, que debo hacer con esto que intercepte, en sí handle tiene varias funciones que nos ayudan aquí usaremos get
Que no es lo mismo que getter
const handler = {
get(target, property){ // le pasamos un objetivo a inspecionar y la propiedad que
// debe inspeccionar, el objetivo el arrgelo la propidad el nombre
if(property in target){ // si esta propiedad existe dentro del target
return target[property] // no hagas nada
}
const sugerencia = Object.keys(target) // si no traeme las key del target
sugerencia.find(key => key.Levenshtime =< 3) // y dentro de sus key vas a buscar
// un elemento muy parecido
} if(sugerencia) {
console.log(`no quisuste decir ${sugerencia} ?`
}
Chicos, les regalo este pequeño ejemplo donde uso un proxy en una función en lugar de un objeto. Es una funcion de suma y utilizo la Trap apply() para detectar cuando se llama a la función y valido que los parametros sean solo dos y ademas sean numericos:
const suma = (num1, num2)=>{
return num1 + num2;
}
const handlerSuma = {
apply(target,thisArg,argumentsList){
console.log("llamaste a la funcion");
if(argumentsList.length > 2){
throw new Error("No se puede ingresar mas de 2 parametros");
}else if(isNaN(argumentsList[0]) || isNaN(argumentsList[1])){
throw new Error("Solo se puede ingresar numeros pibe");
}else{
return target(...argumentsList);
}
},
}
const proxySuma = new Proxy(suma,handlerSuma);
El objeto Proxy se usa para definir un comportamiento personalizado para operaciones fundamentales (por ejemplo, para observar propiedades, cuando se asignan, enumeración, invocación de funciones, etc).
El operador in devuelve true si la propiedad especificada está en el objeto especificado o su prototipo.
muy interesante el uso de los proxy, puede aplicarse en alguna api que se esta desarrollando
vamos a hacer un proxy que evite revelar la contrase?a del usuario
// 1. definimos el objeto original, el cual NO se va a manipular directamente
let privatePersona = {
apellido: "juan",
nombre: "perez",
id: 1,
pass: "awhh!234FAsd",
};
/* 2. para evitar que se devuelva la propiedad pass de forma plana, definimos un objeto handler, con la propiedad get.
es decir, cada vez que se quiera leer una propiedad del objeto primero va a pasar por el este handler
*/
const handler = {
get: function(obj, prop, value){
if(prop === 'pass'){
console.error('You\'re Courious mmm!! you can\'t see this ')
return '*'.repeat(obj[prop].length)
}
return obj[prop]
}
}
//3. definimos el objeto que SI, vamos a usar para interactuar, que es el proxy definido por el objeto original y el handler
const persona = new Proxy(privatePersona, handler)
ahora podemos interactuar con el objeto y probar ver una property
> persona.apellido
< "Ramon"
> persona.pass
< You're Courious mmm!! you can't see this
< "************"
vamos a hacer un proxy para evitar que se escriba la propiedad id
// 1. definimos el objeto original, el cual NO se va a manipular directamente
let privatePersona = {
apellido: "juan",
nombre: "perez",
id: 1,
pass: "awhh!234FAsd",
};
/* 2. para evitar que se escriba la propiedad id, definimos un objeto handler, con la propiedad set.
es decir, cada vez que se quiera setear una propiedad del objeto primero va a pasar por el este handler
*/
const handler = {
set: (obj, prop, value){
if(prop === 'id')
return console.error('No se puede modificar la propiedad id')
return obj[prop]=value
}
}
//3. definimos el objeto que SI, vamos a usar para interactuar, que es el proxy definido por el objeto original y el handler
const persona = new Proxy(privatePersona, handler)
ahora podemos interactuar con el objeto y probar setear una property
> persona.apellido = "Ramon"
< "Ramon"
> persona.id=2
< No se puede modificar la propiedad id
> persona
< Proxy {apellido: "Ramon", nombre: "perez", id: 1, pass: "awhh!234FAsd"}
También recomiendo usar console.warn para darle más enfasis a la sugerencia 😃
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.