Objecto property
Generalmente a un objeto se le pueden añadir nuevas propiedades con una sencilla asignación de un par clave:valor. Pero una propiedad no es solo un valor. Una propiedad posee diferentes características: como que pueda ser modificalbe, o que sea o no enumerable. Pueden ser importantes en cuanto a programación.
Este objeto puede usarse con el método Object.create() para crear un objeto con propiedades y valores en una sola operación
Para crear o modificar las propiedades a fondo usamos el objeto property, cuya estructura es la de un objeto en el uqe la clave es el nombre o descriptor de la propiedad y el valor es un objeto con todas o alguna de las caraterísticas en el fomrato clave : valor.
{ "Precio" : {value : 120, writable : false, enumerable : true}...}
El objeto property tiene estos atributos:
- configurable
- Es true si la propiedad es modificable y borrable
- enumerable
- Es true si la propiedad es enumerable, es decir listable con keys() o con for in.
- value
- El valor guardado en la propiedad,
- writable
- Es true si el valor de la propiedad se puede modificar
Este objeto propiedad es usado por Object por ejemplo al crear un objeto
var persona = {};
yo = Object.create(persona, { "nombre": { value: "Pedro", writable:false} })
Si intentas modificar yo.nombre no te lo permitirá, esta propiedad es inmutable, tiene el atributo writable en false. Al crear un objeto propiedad todos los valores por defecto son false, excepto value que es undefined.
Las propiedades pueden definirse, modificarse o leerse individualmente o por grupos mediante los métodos
- defineProperty() - defineProperties(),
- Para definir o modificar una o varias propiedades
- getOwnPropertyDescriptor() - getOwnPropertyDescriptors()
- Devuelve uno o varios propiedades del objeto
- getOwnPropertyNames()
- Devuelve un array con los nombres de propiedades del objeto
- getOwnPropertySymbols()
- Lee todos los nombres de symbols definidos en el objeto (nombres únicos)
Por ejemplo a partir de un objeto creado por una expresión vamos a leer sus propiedades: características, nombres
fruta={
nombre: "manzana",
epoca:"verano",
precio: 20,
cantidad :5,
total: function(){ return this.cantidad*this.precio}
}
console.log(Object.getOwnPropertyDescriptors(fruta) ); console.log( Object.defineProperty(fruta, "total", {writable:false}) );
Este objeto posee también dos métodos que sirven para leer o establecer el valor de la propiedad, son los métodos get() y set(), por defecto son null, pero pueden ser creados al definir el objeto.
Este sencillo ejemplo usa set() y get() para mostrar la tarifa de un empleado en función de su puesto de trabajo
var persona={nombre:'Juan', horas:5, tarifa:0}
Object.defineProperty(persona, "cobro", {
get: function(){return this.horas*this.tarifa},
set: function(x){(x=="Caja")?this.tarifa=10:this.tarifa=5}
})
persona.cobro = "Almacén"; //se ejecuta set con "Almacén"
console.log(persona.cobro); //25; //se ejecuta get
persona.cobro = "Caja"; //se ejecuta set con "Caja"
console.log(persona.cobro); //50;
Tenemos el objeto persona. Definimos un get() y un set() asociados a la propiedad cobro. Cuando se asigna un valor a cobro se ejecuta la function set con el argumento que se le pase, y cuando leemos el valor de cobro se ejecuta la correspondiente función definida en get
Una propiedad puede tener definidas solo una de las funciones: get o set, no es obligado definir las dos.
Otro ejemplo que termine de aclarar estas interesantes funciones, ahora las definimos directamente en el objeto
var persona={ nombre:'', apellidos:'',
get suNombre(){return "Nombre completo "+this.nombre + " "+this.apellidos},
set suNombre(datos){ this.nombre = datos[0]; this.apellidos = datos[1]}
}
persona.suNombre=["Luis", "Garcia"];
console.log(persona.suNombre); //"Nombre completo: Luis Garcia"
En este otro ejemplo la propiedad asociada a get y set es suNombre.