Saltar al contenido

Getter/setter en javascript array?

Alexa, miembro de nuestro equipo, nos hizo el favor de escribir este enunciado ya que controla perfectamente dicho tema.

Solución:

Usando Proxies, puede obtener el comportamiento deseado:

var _arr = ['one', 'two', 'three'];

var accessCount = 0;
function doSomething() 
  accessCount++;


var arr = new Proxy(_arr, 
  get: function(target, name) 
    doSomething();
    return target[name];
  
);

function print(value) 
  document.querySelector('pre').textContent += value + 'n';


print(accessCount);      // 0
print(arr[0]);           // 'one'
print(arr[1]);           // 'two'
print(accessCount);      // 2
print(arr.length);       // 3
print(accessCount);      // 3
print(arr.constructor);  // 'function Array()  [native code] '

El constructor Proxy creará un objeto que envuelve nuestro Array y usará funciones llamadas trampas para anular los comportamientos básicos. los get se llamará a la función ningún búsqueda de propiedades, y doSomething() antes de devolver el valor.

Los proxies son una característica de ES6 y no son compatibles con IE11 o inferior. Consulte la lista de compatibilidad de navegadores.

El acceso a la matriz no es diferente al acceso a la propiedad normal. array[0] medio array['0']para que pueda definir una propiedad con nombre '0' e interceptar el acceso a la primera array artículo a través de eso.

Sin embargo, eso lo hace poco práctico para todos los arreglos, excepto para arreglos cortos, de longitud más o menos fija. No puede definir una propiedad para “todos los nombres que resulten ser números enteros” de una sola vez.

Busqué en el artículo de John Resig Getters And Setters de JavaScript, pero su ejemplo de prototipo no funcionó para mí. Después de probar algunas alternativas, encontré una que parecía funcionar. Puedes usar Array.prototype.__defineGetter__ de la siguiente manera:

Array.prototype.__defineGetter__("sum", function sum()
var r = 0, a = this, i = a.length - 1;
do 
    r += a[i];
    i -= 1;
 while (i >= 0);
return r;
);
var asdf = [1, 2, 3, 4];
asdf.sum; //returns 10

Trabajó para mí en Chrome y Firefox.

Te invitamos a añadir valor a nuestro contenido asistiendo con tu experiencia en los informes.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *