Objetos

Un objecto en JavaScript es un tipo de dato que se compone de una coleccion de nombres o llave y valores representados en pares de nombre: valor "name:value". Los pares de nombre:valor "name:value", pueden consistir de propiedades "properties" el cual contiene cualquier valor numerico, cadena de caracteres, nulo, undefined o booleano, al igual que metodos "methods" el cual es una funcion dentro del objeto.

Un objeto de JavaScript puede ser completamente enlazada a una entidad independiente como un objeto de la vida real. Por ejemplo un libro, el cual como objeto podemos describirlo por titulo, autor, numeros de paginas y/o genero. Similar a un vehiculo el cual puede describirse por color, desarrollador, modelo y/o poder de fuerza.

Creacion de objeto

Objeto en JavaScript es un tipo de dato, asi como numeros o cadena de caracteres. Como tipo de dato los objetos puede ser contenida en una variable. Existe dos formas de construir un objeto de JavaScript.

  • Objeto literal, usando pareas de llaves {...}
const objectLiteral = {};
console.log(typeof objectLiteral); //-> Object

let Person = {
  name: "John"
};

console.log(Person.name); //-> John
  • Constructor de objeto, el cual es utilizando la palabra reservada new
const objectConstructor = new Object();
console.log(typeof objectConstructor); //-> Object

let Person = new Object();
Person.name = "John";

console.log(Person.name); //-> John
  • Utilizando el metodo de Objeto() Object.create()
const objectCreate = Object.create(null);
console.log(typeof objectCreate); //-> Object

let Person = Object.create(null);
Person.name = "John";

console.log(typeof Person); //-> Object
console.log(Person.name); //-> John
  • Utilizando una funcion en combinacion de la palabra reservada new
function myObject() {};
const objectFunction = new myObject();
console.log(typeof myObject); //-> Function
console.log(typeof objectFunction); //-> Object

function Person(name) {
  this.name = name;
};

let john = new Person("John");

console.log(typeof Person); //-> Function
console.log(typeof john); //-> Object
console.log(john.name); //-> John

Propiedades y metodos

Las propiedades estan asociadas entre un nombre (llave "key") y el valor dentro del objeto, esto valores pueden ser representado por cualquier tipo de datos. Las propiedades comunmente hacen referencias a caracteristicas de algun objeto. Metodos son funciones el cual pueden transformar los valores de las propiedades del objeto.

Acceso a propiedades del objeto

Existen dos maneras de accesar las propiedades de un objeto.

  • Notacion de punto
const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

console.log(Person.firstName); //-> Steve
  • Notacion de corchetes
const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

console.log(Person['firstName']); //-> Steve

De las mismas manera podemos llamar metodos dentro del objetos.

const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

Person.sayName(); //-> Steve McNiller
Person['sayName'](); //-> Steve McNiller

Añadir o modificar propiedades de objeto

Para añadir propiedades a objeto o modificarlo, utilizamos el operador de asignacion y cualquiera de los tipo de notacion.

const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

Person.age = 28;
console.log(Person); //-> {firstName: "Steve ", lastName: "McNiller", sayName: ƒ, age: 28}

Person['sex'] = 'Male';
console.log(Person); //-> {firstName: "Steve ", lastName: "McNiller", sayName: ƒ, age: 28, sex: "Male"}

De la misma manera podemos añadir metodos.

const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

Person.age = 28;
Person['sex'] = 'Male';

Person.sayAge = function() {
  console.log('My age is ' + this.age)
};

Person.sayAge(); //-> My age is 28

Remover propiedades del objeto

Para remover una propiedad dentro del objeto podemos utilizar la palabra reservada delete junto a la propiedad que deseamos remover. Al remover la propiedad tendremos de vuelta el valor cierto indicando que la propiedad a sido exitosamente removida de la propiedad.

const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

Person.age = 28;

const confirmObjDel = delete Person.age;

console.log(confirmObjDel); //-> true
console.log(Person); //-> {firstName: "Steve ", lastName: "McNiller", sayName: ƒ}

Iteraciones atravez de propiedades de objeto

  • Por medio de for...in
const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  age: 28,
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

for(let key in Person) {
  console.log(Person[key]);
}

//-> Steve
//-> McNiller
//-> 28
//-> f()
  • Utilizando metodo de Object() Object.keys() este metodo devuelve un Array de los valores del objeto el cual aplicamos el metodo.
const Person = {
  firstName: 'Steve ',
  lastName: 'McNiller',
  age: 28,
  sayName: function() {
    console.log(this.firstName + this.lastName);
  }
}

const PersonArray = Object.keys(Person);
console.log(PersonArray); //-> ["firstName", "lastName", "age", "sayName"]

Descriptor de propiedad del objeto

Descriptores de objetos en JavaScript, son elemento dentro de los objetos en JavaScript el cual nos provee mas informacion sobre las propiedades dentro de nuestros objetos en JavaScript, estas propiedades determinan el estado del objeto en JavaScript.

Los objetos en JavaScript contiene los descriptores de dato, esto son [[value]], [[writable]], [[configurable]], [[enumerable]] y descriptores de accessor el cual son [[get]], [[set]], [[configurable]] y [[enumerable]].

let obj = {
  name: 'Pete'
};

Por defecto cuando nosotros creamos un objeto como el ejemplo anterior, este objeto obtiene los valores por defecto. Basado al ejemplo anterior, [[value]] es el valor de name 'Pete', el cual es lo que muestra como salida, si escribimos los siguiente console.log(obj.name). [[writable]] esta definido como cierto "true", esto significa que esta permitido cambiar el valor del objeto. [[configurable]] esta definido como cierto "true", este nos permite cambiar o utilizar las propiedades mencionadas. [[enumerable]] significa que si le aplicamos un bucle for...in al objeto de JavaScript, podemos recorrer por las propiedades definidas dentro del objeto JavaScript.

Los descriptores accessor o metodos de mutacion son metodos que nos permite buscar datos privado dentro de objetos, a estos metodos se les llama comunmente [[getter]] y [[setter]].

En JavaScript los objetos contienen unos metodos el cual nos permiten definir y configurar objetos utilizando descriptores.

Object.defineProperty

Metodos es uno de los principales para manejar y configurar objetos.

// Example of used
Object.defineProperty(obj, propName, {})
let user = {};
Object.defineProperty(user, "firstName", {
  value: "Peter",
  configurable: true,
  writable: true,
  enumerable: true
});

console.log(user.firstName); //-> Peter

Por defecto cuando definimos una propiedad dentro del objeto utilizando Object.defineProperty, si no le asignamos un valor utilizando [[value]], este se creara con el valor undefined

let user = {};
Object.defineProperty(user, "firstName", {
  configurable: true,
  writable: true,
  enumerable: true
});

console.log(user.firstName); //-> undefined

Object.defineProperties

Metodos nos permite definir varias propiedades a la misma vez.

Object.defineProperties(obj, props)
let user = {};
Object.defineProperties(user, {
  firstName: {
    value: "Peter",
    writable: true
  },
  getName: {
    value: function() {
      console.log(this.firstName);
    }
  },
});

user.getName(); //-> Peter

Observemos mas ejemplo del uso de estos metodos, digamos que queremos definir propiedades que nunca cambien, que sea constante.

let user = {};
Object.defineProperty(user, "firstName", {
  value: "Peter",
  writable: false,
  configurable: false
});

user.firstName = "Mike";
console.log(user.firstName); // Peter

Digamos que ahora en el proximo ejemplo queremos ocultar propiedades dentro del objeto en JavaScript.

let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.defineProperty(user, "socialSecNum", {
  value: "555-89-7844",
  enumerable: false
});

for(let prop in user) {
  console.log(prop);
}
//-> firstName
//-> lastName

Object.getOwnPropertyNames and Object.keys

Metodos son familiar al metodo keys dictionary del lenguaje de programacion Python, estos nos devuelve un array de las propiedades que se encuentran dentro del objeto de JavaScript, la diferencia entre Object.getOwnPropertyNames y Object.keys es que Object.getOwnPropertyNames nos devuleve todas las propiedades incluyendo las configurada como falso en enumerable.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.defineProperty(user, "socialSecNum", {
  value: "555-89-7844",
  enumerable: false
});

log(Object.getOwnPropertyNames(user)); //-> ["firstName", "lastName", "socialSecNum"]
log(Object.keys(user)); //-> ["firstName", "lastName"]

Object.values

Metodo es similar a Object.keys, este nos devuelve el valor de cada propiedad y al igual que Object.keys, este no retornara propiedades definidas falsa en [[enumerable]].

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.defineProperty(user, "socialSecNum", {
  value: "555-89-7844",
  enumerable: false
});

log(Object.values(user)); //-> ["firstName", "lastName"]

Object.getOwnPropertyDescriptor

Metodo nos devuelve los descriptores de una propiedad especifica que se encuentra dentro del objeto de JavaScript.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};
log(Object.getOwnPropertyDescriptor(user, "firstName")); 
//-> {value: "Peter", writable: true, enumerable: true, configurable: true}

Object.getOwnPropertyDescriptors

Metodo es similar a Object.getOwnPropertyDescriptor, la diferencia es que este nos devuelve todas las propiedades que se encuentre dentro del objeto JavaScript con sus descriptores.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};
log(Object.getOwnPropertyDescriptors(user)); //-> {firstName: {…}, lastName: {…}}

Getter and Setter

Estos son descriptores de accessor o metodos de mutacion de objeto. Al contrario de los descriptores de dato, estos substituyen a los descriptores [[value]] y [[writable]]. [[get]] es la funcion por defecto que se ejecutara cuando llamamos a alguna propiedad el cual le asignamos este metodo [[get]], por defecto sera undefined el valor que devuelve, cuando asignamos un valor a alguna propiedad, el metodo [[set]] es llamado y aplicado a esa propiedad que se la asignamos.

let obj = {
  get propName() {
    // Getter, the code executed on getting obj.propName
  },
  set propName(value) {
    // Setter, the code executed on setting obj.propName = value
  }
}
const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.defineProperty(user, "fullName", {
  get: function() {
    return this.firstName + " " + this.lastName;
  },
  set: function(value) {
    let parts = value.split(' ');

    if(parts.length == 2) {
      this.firstName = parts[0];
      this.lastName = parts[1];
    }
    else {
      throw 'Invalid name format'
    }
  }
});

log(user.fullName); //-> Peter Jackson

user.fullName = "Steve Finn";

log(user.firstName); //-> Steve
log(user.lastName); //-> Finn
log(user.fullName); //-> Steve Finn

Control el estado del objeto

Existen momento el cual queremos prevenir que nuestros objetos esten en el estado de lectura o escritura, los objetos de JavaScript nos provee tres metodos para evitar estos cambios o usos. Estos metodos son: Object.preventExtensions, Object.seal, Object.freeze

Object.preventExtensions

Metodo previene que el objeto de JavaScript sea extendible.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};
Object.preventExtensions(user);

Object.defineProperty(user, "age", {
  value: 22
});

user.age = "one";
log(user.age); //-> Cannot define property age, object is not extensible
Object.isExtensible

Metodo nos devuelve un valor booleano que nos notifica si el objeto JavaScript puede ser extensible.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

log(Object.isExtensible(user)); //-> true
Object.preventExtensions(user);
log(Object.isExtensible(user)); //-> false
Object.seal

Metodo previene que podamos añadir o eliminar propiedades a objetos de JavaScript pero si nos permite editar propiedades del objeto de JavaScript, el objeto estara sellado.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.seal(user);

delete user.firstName;
log(user.firstName); //-> Peter

user.fullName = "Peter Jackson";
log(user.fullName); //-> undefined

user.firstName = "Tom";
log(user.firstName); //-> Tom
Object.isSealed

Metodo nos devuleve un valor booleano que nos notifica se el objeto esta sellado.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.seal(user);
log(Object.isSealed(user)); //-> true
Object.freeze and Object.isFrozen

Metodo es similar a Object.seal, la diferencia es que este objeto ademas que evita añadir y eliminar propiedades, no dejara editar propiedades. Este objeto estara completamente como una variable constante. Object.isFrozen nos devuelve un valor booleano para notificar si nuestro objeto esta congelado.

const log = console.log;
let user = {
  firstName: "Peter",
  lastName: "Jackson"
};

Object.freeze(user);
user.fullName = "Peter Jackson";

log(Object.isFrozen(user)); //-> true
log(user.fullName);

user.firstName = "Tom";
log(user.firstName); //-> Peter

results matching ""

    No results matching ""