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

Clases: métodos de acceso y datos privados

Clases: métodos de acceso y datos privados

Los métodos get/set para controlar el acceso a los datos son uno de los mecanismos que nos ofrece Javascript para mantener nuestros datos fuera de miradas inadecuadas. Esta funcionalidad, junto con WeakMap nos permite implementar una protección bastante razonable de los datos. Veamos cómo…

Clases: métodos

Clases: métodos

Los métodos son una de las partes más importantes de las clases, en ellos incluimos las funciones que queremos que trabajen sobre nuestro objeto. Los métodos tienen un modelo específico de definición y funcionamiento.

Clases: propiedades

Clases: propiedades

Las propiedades son un elemento básico de los objetos y las clases. Podemos definirlos de varias formas, tanto en el objeto como en el constructor y especificar su comportamiento con precisión. Veamos cómo.