informatica:programacion:cursos:programacion_avanzada_javascript:simbolos
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:simbolos [2024/10/17 09:46] – [DEMO: Símbolos como nombres de propiedades] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:simbolos [2024/10/30 13:03] (actual) – [Variables privadas usando símbolos] tempwin | ||
|---|---|---|---|
| Línea 198: | Línea 198: | ||
| Dado el siguiente código, si miramos las propiedades que tiene obj tan solo obtendremos la propiedad v1. La otra propiedad (cuyo nombre es un símbolo) no la vemos de ninguna manera: | Dado el siguiente código, si miramos las propiedades que tiene obj tan solo obtendremos la propiedad v1. La otra propiedad (cuyo nombre es un símbolo) no la vemos de ninguna manera: | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Propiedades símbolo | + | |
| - | </ | + | |
| Se puede ver que la propiedad '' | Se puede ver que la propiedad '' | ||
| Línea 292: | Línea 290: | ||
| ===== DEMO: Símbolos en valores ===== | ===== DEMO: Símbolos en valores ===== | ||
| + | <code javascript> | ||
| + | var handle = function(name) { | ||
| + | |||
| + | var _name = name; | ||
| + | var _status = " | ||
| + | | ||
| + | return { | ||
| + | // getter para devolver la propiedad privada | ||
| + | get name() { return _name; }, | ||
| + | get status() { return _status; }, | ||
| + | open() { | ||
| + | if (_status == " | ||
| + | console.log(" | ||
| + | _status = " | ||
| + | } else { | ||
| + | console.log(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Tras ejecutarlo: | ||
| + | |||
| + | <code javascript> | ||
| + | var h = handle(" | ||
| + | |||
| + | h.name; // -> ' | ||
| + | h.status; // -> ' | ||
| + | |||
| + | h.open(); | ||
| + | // -> Abriendo test | ||
| + | h.open(); | ||
| + | // -> Ya está abierto | ||
| + | </ | ||
| + | |||
| + | Para evitar colisiones con otros posibles valores, usaremos símbolos porque de esa manera tendremos valores únicos para nuestras propiedades y aumentamos la seguridad de nuestro código: | ||
| + | |||
| + | <code javascript> | ||
| + | |||
| + | var handle_status = { | ||
| + | Abierto: Symbol(" | ||
| + | Cerrado: Symbol(" | ||
| + | } | ||
| + | |||
| + | var handle = function(name) { | ||
| + | |||
| + | var _name = name; | ||
| + | var _status = handle_status.Cerrado; | ||
| + | | ||
| + | return { | ||
| + | // getter para devolver la propiedad privada | ||
| + | get name() { return _name; }, | ||
| + | get status() { return _status; }, | ||
| + | open() { | ||
| + | if (_status === handle_status.Cerrado; | ||
| + | console.log(" | ||
| + | _status = handle_status.Abierto; | ||
| + | } else { | ||
| + | console.log(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Tras ejecutarlo: | ||
| + | |||
| + | <code javascript> | ||
| + | var h = handle(" | ||
| + | |||
| + | h; // -> Object { name: Getter, status: Getter, open: open() } | ||
| + | |||
| + | h.name; // -> ' | ||
| + | |||
| + | h.status; // -> Symbol(C) | ||
| + | |||
| + | h.open(); | ||
| + | // -> Abriendo edu | ||
| + | h.open(); | ||
| + | // -> Ya está abierto | ||
| + | |||
| + | h.status === handle_status.Abierto; | ||
| + | </ | ||
| ===== DEMO: Símbolos en nombres de métodos ===== | ===== DEMO: Símbolos en nombres de métodos ===== | ||
| + | Queremos hacer un objeto que sirva para mostrar información de otros objetos: | ||
| + | |||
| + | <code javascript> | ||
| + | var Dumper = function() { | ||
| + | this.dumpObject = function(obj) { | ||
| + | console.log(" | ||
| + | if (typeof(obj[" | ||
| + | obj[" | ||
| + | } else { | ||
| + | for (var k in obj) { | ||
| + | console.log(k, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Creamos un objeto: | ||
| + | |||
| + | <code javascript> | ||
| + | var a = {v: 42, ov: 69, foo() {} }; | ||
| + | |||
| + | var b = {v: 42, ov: 69, foo() {}, dump() { console.log(" | ||
| + | |||
| + | var myDumper = new Dumper(); | ||
| + | |||
| + | myDumper.dumpObject(a); | ||
| + | |||
| + | myDumper.dumpObject(b); | ||
| + | </ | ||
| + | |||
| + | Para evitar colisiones con otros métodos '' | ||
| + | |||
| + | <code javascript> | ||
| + | var Dumper = function() { | ||
| + | this.dumpObject = function(obj) { | ||
| + | console.log(" | ||
| + | if (typeof(obj[Dumper.dump]) == " | ||
| + | obj[Dumper.dump](); | ||
| + | } else { | ||
| + | for (var k in obj) { | ||
| + | console.log(k, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | Dumper.dump = Symbol(" | ||
| + | |||
| + | var a = {v: 42, ov: 69, foo() {}, [Dumper.dump]() { console.log(" | ||
| + | |||
| + | var myDumper = new Dumper(); | ||
| + | |||
| + | myDumper.dumpObject(a); | ||
| + | </ | ||
| + | |||
| + | Ahora este código no tendrá colisiones con ningún otro objeto. | ||
| ===== Símbolos globales ===== | ===== Símbolos globales ===== | ||
| + | |||
| + | A pesar de que el objetivo básico de los símbolos es proporcionar nombres únicos y evitar las colisiones, de forma que solo quien tenga acceso al símbolo original podrá reproducir este nombre, **ECMAScript 2015 da la posibilidad de crear símbolos globales**. Un símbolo global es un símbolo pero que cualquiera que conozca la cadena identificativa de este símbolo puede recrear: | ||
| + | |||
| + | <code javascript> | ||
| + | var s1 = Symbol.for(" | ||
| + | var s2 = Symbol.for(" | ||
| + | s1 === s2; // true | ||
| + | s1 == s2; // true | ||
| + | var s3 = Symbol(" | ||
| + | s1 === s3; // false | ||
| + | var s4 = Symbol.for(" | ||
| + | s1 === s4; // false | ||
| + | </ | ||
| + | |||
| + | Los símbolos globales se crean con '' | ||
| + | |||
| + | Los símbolos globales permiten seguir usando símbolos para métodos o valores concretos, pero evitan el tener que exponer este símbolo para quien necesite usarlo. | ||
| + | |||
| + | En el vídeo anterior, teníamos que exponer el símbolo a través de la variable '' | ||
| + | |||
informatica/programacion/cursos/programacion_avanzada_javascript/simbolos.1729151176.txt.gz · Última modificación: por tempwin
