Con la propiedad prototype de la clase Array es posible agregar funcionalidad a un array o bien extender ciertos métodos si es que existe tal necesidad. A pesar de que la clase Array tiene muchos métodos útiles (prototypeDef) a veces es necesario agregar métodos que nos faciliten el desarrollo.

Veamos un ejemplo sencillo para entender su funcionamiento:

Array.prototype.fernet = function() {
    console.log('Fernet + JS!');
};

var vector = [];
vector.fernet();
 

Con el ejemplo vemos que la función ‘fernet’ fue agregada entre los métodos disponibles para todos los objetos array que haya. Esto puede ser problemático en el caso de que necesitemos usar un ciclo del tipo ‘for..in’ (ver post Usando for each con arrays).

Veamos otro ejemplo:

Array.prototype.where = function(func) {
    var found = [];
    for (var i = 0, l = this.length; i < l; ++i) {
        var item = this[i];
        if (func(item))
            found.push(item);
    }
    return found;
};

var conjunto = [];
conjunto[0] = 0;
conjunto[1] = 1;
conjunto[2] = 2;
conjunto[3] = 3;

var resultado = conjunto.where(function(a){
    return a<2?true:false;
});

console.log(conjunto);
console.log(resultado);
 

En el ejemplo vemos que se implementó el método ‘where’ que recibe un condición y devuelve un nuevo array que contiene los elementos que cumplen esa condición.

¿Ahora qué pasa si queremos extender la funcionalidad de un determinado método? Veamos este ejemplo que extiende la funcionalidad para el método push:

Array.prototype.push=(function(){
    var original = Array.prototype.push;
    return function() {
        console.log('push modificado globalmente!!');
        return original.apply(this,arguments);
    };
})();
 

Como pueden ver este método modifica el método push globalmente lo que hará que cada array tenga este push modificado entre sus métodos lo cual no es recomendable.

Para evitar esto veamos lo que hace este ejemplo:

var arr = [1,2,3,4];

arr.push = function (){
    console.log('push modificado!');
    return Array.prototype.push.apply(this,arguments);
};

arr.push(5);
console.log(arr);

var arr2 = [1,2];
arr2.push(3);
console.log(arr2);
 

De esta forma sólo se modifica el método push para el array llamado ‘arr’, no siendo así para ‘arr2’ que tuvo una ejecución normal del método.

Como conclusión se puede decir que la propiedad prototype es una herramienta potente para agregar métodos y extender la funcionalidad de otros aunque debe ser usada con cuidado.