Aplicaremos la abstracción y encapsulamiento a nuestros objetos en JavaScript sin necesidad de utilizar prototipos ni clases. Emplearemos el deep copy para generar nuevos objetos a partir de un objeto base y los encapsularemos con ayuda de los métodos del superprototipo Object tales como defineProperty, seal y freeze.
Con esto podemos crear nuevos estudiantes generando copias a partir de este objeto literal studentBase. Para ello emplearemos deep copy con recursividad:
Encapsulamiento de objetos con Object.defineProperty
Sabemos que con Object.defineProperty es posible editar las propiedades writable, enumerable y configurable de los atributos de un objeto. Con esto limitamos el acceso a los datos de los nuevos objetos que generemos.
Editemos la propiedad configurable del atributo name del objeto juan para evitar que sea borrada:
Object.defineProperty(juan,"name",{value:"Juanito",// Definimos el valor del atributo "name" como "Juanito"configurable:false});// El resto de propiedades (writable y enumerable) por defecto serán true// Si intentamos borrar el atributo "name" ...delete juan.name// Observamos que no fue eliminado dicho atributo, pues bloqueamos su eliminaciónconsole.log(juan);/* > Mensaje en consola
{
name: 'Juanito',
email: undefined,
age: undefined,
approvedCourses: undefined,
learningPaths: undefined,
socialMedia: { twitter: undefined, instagram: undefined, facebook: undefined }
}
*/
Object.seal para restringir la eliminación de atributos
Seguramente deseemos tener esta configuración con el resto de nuestros atributos y así evitar que sean borradas, pero tendríamos que hacerlo uno por uno. Podemos simplificar esta labor utilizando Object.seal:
Object.seal(juan);// Ahora todos los atributos están restringidos a que sean eliminados
Verificar si no se pueden borrar los atributos de un objeto
Con Object.isSealed podemos comprobar si todas las propiedades de un objeto están bloqueadas a que sean eliminadas. Nos devolverán un booleano.
Object.isSealed(juan);
Verificar si los atributos de un objeto no pueden ser borradas ni editadas
Empleamos Objcet.isFrozen para preguntar si las propiedades de un objeto están restringidas a su eliminación y edición. Devolverá un booleano.
Object.isFrozen(juan);
Contribución creada por: Martín Álvarez (Platzi Contributor) con el aporte de Javier Salcedo Salgado.
El método **Object.isSealed()** si el objeto está sellado.
Devuelve true si el objeto está sellado, de lo contrario devuelve false. Un objeto está sellado si no es extensible y si todas sus propiedades no se pueden configurar y por lo tanto no removibles (pero no necesariamente no modificables).
El método **Object.isFrozen()** determina si un objeto está congelado.
Devuelve true si el objeto está sellado, de lo contrario devuelve false. Un objeto está sellado si no es extensible y si todas sus propiedades no se pueden configurar y por lo tanto no removibles (pero no necesariamente no modificables).
Un objeto está congelado si y solo si no es extendible, todas sus propiedades son no-configurables, y todos los datos de sus propiedades no tienen capacidad de escritura.
Código Clase
/* Codigo para hacer un DeepCopy */const studentBase ={name:undefined,email:undefined,age:undefined,approvedCourse:undefined,learningPaths:undefined,socialMedia:{twitter:undefined,instagram:undefined,facebook:undefined,}};const carlos =deepCopy(studentBase);// Object.defineProperty(carlos, "name", {// value: "Carlitos",// configurable: false,// });Object.seal(carlos);// Es lo mismo que lo de arriba pero mas easycarlos.name="Carlitos";Object.isSealed(carlos);// Nos muestra con True o False si todas las propiedades estan selladasObject.isFrozen(carlos);// Nos muestra con True o False si todas las propiedades estan congeladas
gracias
¿Eso es TypeScript? ¿O cómo se le conoce a eso?
Hola Kevin, si es TS.
Para los que somos mas gráficos...
La finalidad de esta clase es demostrar que podemos crear objetos, sin prototipos o clases, esto haciendo uso de un objeto literal como molde (donde se aplico abstracción) y además poder encapsular sus propiedades haciendo uso de los métodos estáticos del prototipo global Object
Abstracción con objetos literales y deep copy
const studentBase ={name:undefined,email:undefined,age:undefined,approvedCourses:undefined,learningPaths:undefined,socialMedia:{facebook:undefined,twitter:undefined,instagram:undefined,}};const juan =deepCopy(studentBase);Object.seal(juan);//* Ninguna propiedad del objeto Juan se podrá eliminarObject.isSealed(juan);//* Pregunta si tiene todas sus propiedades protegidasObject.isFrozen(juan);//* Pregunta si tiene todas sus propiedades protegidas y además no se pueden agregar otras
Object.seal(obj) se usa para evitar borrar propiedades
Object.freeze(obj) se usa para evitar borrar y editar una propiedad
¿Cómo puede ser que la documentación de MDN diga que configurable, eumerable y writable por defecto son false PERO según el profe y probando en la consola por defecto sean true?
o.a=1;// es equivalente a :Object.defineProperty(o,'a',{value:1,writable:true,configurable:true,enumerable:true});// Sin embargo,Object.defineProperty(o,'a',{value:1});// es equivalente a :Object.defineProperty(o,'a',{value:1,writable:false,configurable:false,enumerable:false});
¡Aaamigo! Perfecto, tema aclarado después de un buen rato descolocado jajaja.
.
¡Muchas gracias, Juan!
Mi resumen:
/*-----------------Abstracción de objetos literales-------------------*/// OBJETO BASEconst studentBase ={name:undefined,email:undefined,age:undefined,approvedCourses:undefined,learningPaths:undefined,socialMedia:{twitter:undefined,instagram:undefined,facebook:undefined,},};//Con esto podemos crear nuevos estudiantes generando copias a partir de este objeto literal studentBase.functionisObject(subject){returntypeof subject =="object";}functionisArray(subject){returnArray.isArray(subject);}// FUNCIÓN RECURSIVAfunctiondeepCopy(subject){let copySubject;const subjectIsObject =isObject(subject);const subjectIsArray =isArray(subject);if(subjectIsArray){ copySubject =[];}elseif(subjectIsObject){ copySubject ={};}else{return subject;}for(key in subject){const keyIsObject =isObject(subject[key]);if(keyIsObject){ copySubject[key]=deepCopy(subject[key]);}else{if(subjectIsArray){ copySubject.push(subject[key]);}else{ copySubject[key]= subject[key];}}}return copySubject;}// GENERANDO NUEVOS OBJETOSconst rica =deepCopy(studentBase);const terry =deepCopy(studentBase);/*-----------------Encapsulación de objetos literales-------------------*/Object.defineProperty(rica,"name",{//También permite editar propiedades existentesvalue:"Ricardito",// Definimos el valor del atributo "name" como "Juanito"configurable:false});// El resto de propiedades (writable y enumerable) por defecto serán true// Si intentamos borrar el atributo "name"delete rica.name// Observamos que no fue eliminado dicho atributo, pues bloqueamos su eliminaciónconsole.log(rica);/*
{
name: 'Ricardito',
email: undefined,
age: undefined,
approvedCourses: undefined,
learningPaths: undefined,
socialMedia: { twitter: undefined, instagram: undefined, facebook: undefined }
}
*/console.log(Object.seal(rica));// Ahora todos los atributos están restringidos a que sean eliminadosconsole.log(Object.isSealed(rica));//true //Verificar si no se pueden borrar los atributos de un objeto
Object.isSealed(juan);// Lo que nos permite este método es que si todas las propiedades de nuestro objeto que enviemos como argumento tienen la protección como "configurable": false. Nos mandaría true o false.Object.isFrozen(juan);// Este método nos dice que si todas las propiedades que tengamos en nuestro objeto tengan el "writable" y "configurable" como false, esto quiere decir que no podremos editar ni borrar nuestras propiedades.
6. Abstracción y encapsulamiento sin usar prototipos ni clases
Object.defineProperty()
Crear una nueva propiedad y edita alguna que ya habíamos creado:
Object.defineProperty(juan,"name",{value:"Luis Alberto Spinetta",configurable:false,})// proteje nuestras propiedades
Object.seal()
Un atajo para que las propiedades no se puedan editar
Object.isSealed()
Verifica si un objeto está sellado o no
Object.isFrozen()
determina si un objeto está congelado o no
Excelente clase
Profe, una pregunta, en que casos es mejorar usar esta forma de asbtraer sin proptipos vs con prototipos, Gracias. Excelente clase
En ningún caso es mejor usar una u otra forma. El objetivo de este curso es que no solo sepamos trabajar con prototipos usando la sintaxis de clases, sino también con objetos literales o incluso con los prototipos tal cual. Así cuando te los encuentres en código de alguien más podrás entenderlo a la perfección. Usa la sintaxis con la que te sientas más cómodo. :wink:
se puede hacer el deep copy utilizando los metodos estáticos de JSON (.stringify() y .parce()), ya que no tiene métodos y solo es un objeto complejo con el que estamos trabajando ? (lo hice pero no lo immprime tal cual como con tu ejemplo en consola, eso creo)
protege a que se pueda eliminar nuestras propiedades.🗑️
Object.isSealed
verifica que todas las propiedades de nuestro objeto, tiene la proteccion configurable como false.✅
Object.isFrozen(juanito)
verifica que todas las propiedades no se borren ni editen.✅
La abstracción se logra mediante factory functions que devuelven objetos con acceso restringido, ocultando la implementación interna.
El encapsulamiento se basa en dos pilares:
Closures: mantienen el estado privado.
Interfaces públicas: exponen solo lo necesario.
Así, el estado del objeto queda protegido sin necesidad de sintaxis compleja.
No es mejor crear una clase en vez de hacer un molde con un objeto literal? O sea ya sé que esta clase es para mostrarnos que se puede hacer también así, pero, cuál sería una mejor manera. En mi opinión crear un prototipo es más sencillo.
creo que todo el curso se fuese resumido en 4 videos y no hacer 20
Cada clase se explica los diferentes problemas paso a paso que puede suceder si no aplicas bien la copia de objetos. Aunque sean muchas, cada una te hace ver los métodos existentes de objetos, inclusive explicaron el tema de JSON, que se ve más adelante en otros cursos.
La funcion del deepCopy habria que corregirla para la parte de arrays, ya que si se copia elementos que son arrays o propiedades que son arrays, no los guarda como arrays tal cual, sino como objetos en donde la clave se convierte en el indice y el valor en el valor del array, por ejemplo al copiar el array [0,1,2,3,4] se obtiene el elemento {0:1,1:2,2:3,3:4}
En esta clase no terminé de comprender la ventaja de crear un objeto a partir de una deep copy de otro objeto, vs lo que se enseña en la clase anterior (que creo que estaba pensada como siguiente a esta) de hacerlo con una función RORO, que a efectos de la verdadera creación de un objeto, me parece más práctico ya que se pueden definir los valores de las propiedades desde el momento cero y realizar validaciones mucho más completas que con este método. Aunque si fue una buena adición el recordar lo del encapsulamiento con seal y freeze.