Métodos de objetos de JavaScript ES5

ECMAScript 5 (2009) agregó muchos nuevos métodos de objetos a JavaScript.

Gestión del objeto

// Crea un objeto con el objeto existente como prototipo
Object.create()
// Añadir o cambiar propiedades del objeto
Object.defineProperty(object, property, descriptor)
// Añadir o cambiar propiedades del objeto
Object.defineProperties(object, descriptors)
// Acceder a la propiedad
Object.getOwnPropertyDescriptor(object, property)
// Devuelve un array con todas las propiedades
Object.getOwnPropertyNames(object)
// Acceder al prototipo
Object.getPrototypeOf(object)
// Devuelve un array con propiedades enumerables
Object.keys(object)

Protección del objeto

// Evita la adición de propiedades al objeto
Object.preventExtensions(object)
// Si las propiedades se pueden agregar al objeto, devuelve true
Object.isExtensible(object)
// Evita la modificación de las propiedades del objeto (no los valores)
Object.seal(object)
// Si el objeto está sellado, devuelve true
Object.isSealed(object)
// Evita cualquier cambio en el objeto
Object.freeze(object)
// Si el objeto está congelado, devuelve true
Object.isFrozen(object)

Cambio de valor del atributo

Sintaxis

Object.defineProperty(object, property, {value : value)

Instancia

Este ejemplo cambia el valor del atributo:

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
// Modificación del atributo
Object.defineProperty(person, "language", {value : "NO"});

Prueba por su cuenta

Cambio de metadata

ES5 permite cambiar la metadata de los siguientes atributos:

writable : true      // Valor del atributo modificable
enumerable : true    // Atributo enumerable
configurable : true  // Atributo reconfigurable
writable : false     // Valor del atributo no modificable
enumerable : false   // Atributo no enumerable
configurable : false // La propiedad no se puede reconfigurar

ES5 permite cambiar getter y setter:

// Definir getter
get: function() { return language }
// Definir setter
set: function(value) { language = value }

Este ejemplo establece "language" como de solo lectura:

Object.defineProperty(person, "language", {writable:false});

Este ejemplo hace que "language" no sea enumerable:

Object.defineProperty(person, "language", {enumerable:false});

Listar todas las propiedades

Este ejemplo lista todas las propiedades del objeto:

Instancia

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
Object.defineProperty(person, "language", {enumerable:false});
Object.getOwnPropertyNames(person);  // Devuelve un array de arrays

Prueba por su cuenta

Listar propiedades enumerables

Este ejemplo solo lista las propiedades enumerables del objeto:

Instancia

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
Object.defineProperty(person, "language", {enumerable:false});
Object.keys(person);  // Devuelve un array de propiedades enumerables

Prueba por su cuenta

Agregar propiedad

Este ejemplo agrega una nueva propiedad al objeto:

Instancia

// Crear objeto
const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
// Agregar propiedad
Object.defineProperty(person, "year", {value:"2008"});

Prueba por su cuenta

Agregar Getter y Setter

Object.defineProperty() El método también se puede usar para agregar Getter y Setter:

Instancia

// Crear objeto
const person = {firstName:"Bill", lastName:"Gates"};
// Definir getter
Object.defineProperty(person, "fullName", {
  get: function () {return this.firstName + " " + this.lastName;}
});

Prueba por su cuenta

Una instancia de contador

// Definir objeto
const obj = {counter:0};
// Definir setter
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (i) {this.counter -= i;}
});
// Operación del contador:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;

Prueba por su cuenta