informatica:programacion:cursos:programacion_avanzada_javascript:proxies
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:programacion_avanzada_javascript:proxies [2024/10/28 14:55] – [DEMO: Creando un "congelador" de objetos - Parte 2] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:proxies [2024/10/30 16:03] (actual) – [Recursos] tempwin | ||
|---|---|---|---|
| Línea 413: | Línea 413: | ||
| <code javascript> | <code javascript> | ||
| + | // Utilizaremos un WeakMap para guardar las variables privadas | ||
| + | // de los objetos de tipo Freezer | ||
| + | const _privates = new WeakMap(); | ||
| + | const createConfig = function(pr) { | ||
| + | return { | ||
| + | set (target, key, receiver) { | ||
| + | var prop = target[key]; | ||
| + | if (pr.frozen) { | ||
| + | return prop. | ||
| + | } else { | ||
| + | target[key] = receiver; | ||
| + | return receiver; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class Freezer { | ||
| + | |||
| + | constructor(obj) { | ||
| + | let pr = {}; | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | // Método para " | ||
| + | frozen(value) { | ||
| + | let pr = _privates.get(this); | ||
| + | pr.frozen = value ? true : false; | ||
| + | } | ||
| + | |||
| + | get value() { | ||
| + | let pr = _privates.get(this); | ||
| + | return pr.proxy; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Probamos: | ||
| + | |||
| + | <code javascript> | ||
| + | var obj = {v:42}; | ||
| + | |||
| + | var freezer = new Freezer(obj); | ||
| + | var proxy = freezer.value; | ||
| + | |||
| + | proxy; // Object { v: 42 } | ||
| + | |||
| + | // Congelamos el objeto: | ||
| + | freezer.frozen(true); | ||
| + | |||
| + | // Comprobemos que realmente está congelado: | ||
| + | |||
| + | prop.v = 100; | ||
| + | |||
| + | proxy.v; // 42 | ||
| + | |||
| + | // Para descongelarlo: | ||
| + | freezer.frozen(false); | ||
| + | |||
| + | prop.v = 200; | ||
| + | proxy.v; // 200 | ||
| </ | </ | ||
| ===== DEMO: Creando un " | ===== DEMO: Creando un " | ||
| + | Después de lo anterior, vamos a agregar un método ficticio al proxy que llamándolo nos permita congelar el propio objeto. | ||
| + | |||
| + | Queremos lograr hacer algo como '' | ||
| + | |||
| + | Vamos a ello: | ||
| + | |||
| + | <code javascript> | ||
| + | // Utilizaremos un WeakMap para guardar las variables privadas | ||
| + | // de los objetos de tipo Freezer | ||
| + | const _privates = new WeakMap(); | ||
| + | |||
| + | // Para asegurarnos de que el nombre del método que crearemos | ||
| + | // en el proxy es único y no tenga conflictos, utilizaremos un símbolo | ||
| + | const _freeze = Symbol(" | ||
| + | |||
| + | const createConfig = function(pr) { | ||
| + | return { | ||
| + | set (target, key, receiver) { | ||
| + | var prop = target[key]; | ||
| + | if (pr.frozen) { | ||
| + | return prop. | ||
| + | } else { | ||
| + | target[key] = receiver; | ||
| + | return receiver; | ||
| + | } | ||
| + | }, | ||
| + | get (target, key, receiver) { | ||
| + | if (key === _freeze) { | ||
| + | return function(v) { | ||
| + | pr.frozen = v ? true : false; | ||
| + | return pr.frozen; | ||
| + | } | ||
| + | } else { | ||
| + | return target[key]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class Freezer { | ||
| + | |||
| + | constructor(obj) { | ||
| + | let pr = {}; | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | // Método para " | ||
| + | frozen(value) { | ||
| + | let pr = _privates.get(this); | ||
| + | pr.frozen = value ? true : false; | ||
| + | } | ||
| + | |||
| + | get value() { | ||
| + | let pr = _privates.get(this); | ||
| + | return pr.proxy; | ||
| + | } | ||
| + | | ||
| + | // getter para obtener el símbolo | ||
| + | static get freeze() { | ||
| + | return _freeze; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Probamos: | ||
| + | |||
| + | <code javascript> | ||
| + | var obj = {v:42}; | ||
| + | |||
| + | var freezer = new Freezer(obj); | ||
| + | var proxy = freezer.value; | ||
| + | |||
| + | // Congelamos: | ||
| + | proxy[Freezer.freeze](true); | ||
| + | |||
| + | proxy.v = 100; | ||
| + | |||
| + | proxy,.v; // 42 | ||
| + | |||
| + | obj.v; // 42 | ||
| + | |||
| + | // Descongelamos: | ||
| + | freezer.frozen(false); | ||
| + | |||
| + | proxy.v = 100; | ||
| + | |||
| + | proxy.v; // 100 | ||
| + | obj.v; // 100 | ||
| + | </ | ||
| + | |||
| + | ===== Recursos ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
informatica/programacion/cursos/programacion_avanzada_javascript/proxies.1730123749.txt.gz · Última modificación: por tempwin
