A veces, al usar un objeto de terceros, he sentido la tentación de añadirle un atributo propio. Por ejemplo, en mi trabajo usamos Backbone y en algunas ocasiones hemos querido añadirle características extra a algunas instancias. Imaginad la siguiente situación. No hace falta que conozcáis Backbone, es sólo un ejemplo.
Esto podría sacarnos de un apuro, ¡pero también meternos en muchos otros! ¡Añadir atributos nuestros a objetos de terceros es un antipatrón!. ¿Qué problemas podíamos tener?
Backbone podría tener implementado un método isRendered para las vistas, nos lo habríamos cargado.
Backbone podría implementar en el futuro dicho método.
JavaScript podría implementar en Object.prototype un método isRendered, método que también nos habríamos cargado.
Si quisiesemos iterar por las propiedades del objeto, ¡ahora tendríamos este nuevo intruso!
En definitiva, no es una solución apropiada. Con la nueva especificación de JavaScript, podemos usar los Símbolos para conseguirlo.
¿Cómo podríamos hacer algo similar a lo del ejemplo anterior pero usando símbolos?
Y aquí algunos ejemplillos más de como funcionan los símbolos.
JavaScript es un lenguaje temido por muchos y vilipendiado por muchos otros. Una de sus principales fuentes de críticas es la coerción de tipos. Ya sabéis, todo eso de [] + {} frente a {} + [], etc. Symbol es un nuevo tipo, y no posee esa coerción implícita que a veces nos juega malas pasadas.
El artículo ha quedado algo caótico, así que sintetizando: ahora tenemos los símbolos, nuevo tipo de datos que sirve como identificador único para atributos de objetos. Mirad los comentarios del código que he puesto y trastead un poco en la consola. Para más info, como siempre os remito a la página de Mozilla Hacks, y también a la de MDN. Reconozco que esta no es la característica más excitante de ES6, pero aun así merece estar en mi blog.