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.