Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/12/2013, 05:45
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 5 meses
Puntos: 32
Añadir métodos a una clase no enumerables.

Buenas,

Tengo el siguiente problema añadiendo nuevos métodos a una clase Javascript. Por ejemplo, defino estos dos métodos:

Código Javascript:
Ver original
  1. Array.prototype.equal = function( e )
  2. {
  3.     return !( this < e || e < this );
  4. }
  5.  
  6. Array.prototype.findIndex = function( callback ) {
  7.     for( i in this )
  8.         if( callback(i,this[i],this) )
  9.             return i;
  10.     return -1;
  11. }

Y los aplico:
Código Javascript:
Ver original
  1. console.log( [3,4].equal([3,4]) );
  2. console.log( [[6,3],[1,2]].findIndex( function(e){ return e.equal([1,2]) }) );
Y me manda el siguiente error:
Código Javascript:
Ver original
  1. true test.js:85
  2. Uncaught TypeError: Object 0 has no method 'equal'
No sé a que se refiere al objeto 0. Así que debugueo un poco:
Código Javascript:
Ver original
  1. Array.prototype.findIndex = function( callback ) {
  2.     for( i in this )
  3.         console.log( i );
  4.         /*if( callback(i,this[i],this) )
  5.             return i;
  6.     return -1;*/
  7. }
Y veo que me enumera tanto los indices 0,1 como los nuevos métodos definidos equal y findIndex:
Código Javascript:
Ver original
  1. true test.js:85
  2. 0 test.js:16
  3. 1 test.js:16
  4. equal test.js:16
  5. findIndex test.js:16
  6. undefined
He mirado a que se debe y he encontrado que existe un método Object.defineProperty que por un lado evitaría que recorriera las nuevas propiedades equal y findIndex , poniendo el valor de "enumerable" a false. Sin embargo, se describe Object.defineProperty como modificador de un objeto/instancia y no de una clase. A mi me gustaría añadir un método no enumerable en una clase.

¿Hay alguna manera de hacerlo? ¿El error "Uncaught TypeError: Object 0 has no method 'equal' " tiene algo que ver con que al recorrer el array se recorren también dichos nuevos métodos definidos?

Un saludo y gracias!
__________________
github.com/xgbuils | npm/xgbuils