Seleccionar página

Las de propiedades de los objetos se crean y utilizan con facilidad en Javascript, pero se suelen desconocen algunas de sus más interesantes características que nos pueden permitir un mayor control sobre ellas. En este mismo sentido, los métodos de Object son unos grandes desconocidos. Son soportados por todos los navegadores modernos (incluido IE9), pero siguen siendo poco aprovechados. Varios de estos métodos nos van a ayudar a entender las principales características de las propiedades de los objetos en Javascript y sacarles todo el partido.

Veamos la diferencia entre las propiedades propias y las propiedades heredadas. Las propiedades propias son las creadas directamente en un objeto. Cuando las propiedades son creadas en el constructor por medio de this o asignadas dinámicamente sobre el objeto, son propiedades propias del objeto, ya que se crean sobre la instancia directa del objeto.

function Triangulo() {
    // Propiedades creadas en el contructor sobre el objeto
    this.a =  60;
    this.b =  60;
    this.c =  60;
}

var equilatero = new Triangulo();
equilatero.tipo = "equilátero"; // Propiedad creada sobre el propio objeto

for (var prop in equilatero) {
    if (!equilatero.hasOwnProperty(prop)) continue;
    console.log(prop); // muestra nada a, b, c y tipo
}

Las propiedades heredadas son creadas en la cadena de prototipos de objeto. Cuando se crean por medio de prototype no pertenecen como tal al objeto y se consideran heredadas.

function Triangulo() {
}
// Propiedades creadas en el prototipo
Triangulo.prototype.a =  60;
Triangulo.prototype.b =  60;
Triangulo.prototype.c =  60;

function Equilatero() {
}
// Aumentar la cadena de prototipos
Equilatero.prototype = Triangulo.prototype;
Equilatero.prototype.tipo = "equilátero";

var equilatero = new Equilatero();

for (var prop in equilatero) {
    if (!equilatero.hasOwnProperty(prop)) continue;
    console.log(prop); // no muestra nada
}

Como se habrá podido observar, for in recorre las propiedades propias y heredadas de un objeto y por medio de hasOwnProperty podemos diferenciar unas de otras.

La recomendación de utilizar hasOwnProperty en los bucles for in viene dada por este hecho, ya que si algún paquete o librería poco cuidadosa modifica el prototipo de, por ejemplo, Object, todos nuestros bucles encontrarán esta propiedad y, muy probablemente, tengan un comportamiento no controlado.

function Triangulo() {
    this.a =  60;
    this.b =  60;
    this.c =  60;
}
var equilatero = new Triangulo();
equilatero.tipo = "equilátero";

// Se añade un método a todos los objetos
Object.prototype.debug = function() {
    //...
};

for (prop in equilatero) {
    console.log(prop); // a, b, c, tipo y debug
}

Una forma alternativa para poder obtener sólo las propiedades propias de un objeto es utilizar Object.getOwnPropertyNames(objeto). Este es un método disponible desde ECMAScript 5.1 y devuelve una matriz con los nombres de las propiedades propias del objeto, sin incluir las propiedades heredadas.

function Triangulo() {
    this.a =  60;
    this.b =  60;
    this.c =  60;
}
var equilatero = new Triangulo();
equilatero.tipo = "equilátero";

Object.getOwnPropertyNames(equilatero).forEach(function(prop) {
    console.log(prop); // a, b, c y tipo
});

Object.prototype.debug = function() {
    //...
};

Object.keys(equilatero).forEach(function(prop) {
    console.log(prop); // a, b, c y tipo
});

Una ventaja adicional de Object.keys(objeto) es que podemos utilizar los métodos de manejo de matrices como forEach(), filter(), map() o reduce().

Novedades

Datos inmutables en Javascript

Datos inmutables en Javascript

En Javascript todo parece mutable, es decir, que se puede cambiar, pero lo cierto es que también nos ofrece varios mecanismos para conseguir que los datos que manejamos, especialmente los objetos, sean inmutables. Te invitamos a descubrir cómo…

Copiar objetos en Javascript

Copiar objetos en Javascript

Copiar objetos no es algo sencillo, incluso se podría decir que en si mismo no es posible, ya que el concepto «copiar» no entra dentro del paradigma de los objetos. No obstante, por medio de instrucciones como Object.assign() hemos aprendido como obtener objetos con las mismas propiedades, pero está técnica no se puede aplicar a todos los tipos de objetos disponibles en Javascript. Vamos a ver cómo podemos copiar cualquier tipo de objeto…

Descubre los Javascript Array Internals

Descubre los Javascript Array Internals

El Array es una de las estructuras más utilizadas en Javascript y no siempre bien comprendida. Hoy os invitamos a analizar el comportamiento interno de este objeto y descubrir cómo Javascript implementa las diferente acciones con los Array y que operaciones internas se realizan en cada caso.

Web Components: pasado, presente y futuro

Web Components: pasado, presente y futuro

Los Web Components aparecieron en el panorama de desarrollo hace ya bastante tiempo. Desde su presentación se les ha prestado mucha atención, pero lo cierto es que no han sido acogidos de forma generalizada, quizás por la difusión de nuevos y potentes frameworks. Nos preguntamos qué ha pasado con este estándar y, sobre todo, que puede pasar de aquí en adelante con el uso práctico de los componentes web.