2010-03-01 16 views
11

Teniendo en cuenta el siguiente ejemplo javascript:¿Existe una clave catch-all para un objeto javascript?

var myobj = { func1: function() { alert(name in this) }, 
       func2: function() { alert(name in this) }, 
       func3: function() { alert(name in this) } 
} 

myobj.func2(); // returns true 
myobj.func4(); // undefined function 

¿Es posible crear una clave 'catch-all' para myobj que se llama si no hay ninguna clave/función definida (como en func4()), manteniendo la myobj.functionCall() ¿formato?

+0

¿De verdad? ¿Te importa apuntar a uno? Si puede encontrar uno, borraré la pregunta. – user113716

+0

@Pointy - ¿Estás diciendo que no puedes imaginar cómo se podría implementar en el idioma? Si es así, ¿qué tal una clave comodín como *? – user113716

+0

Estoy diciendo que soy demasiado tonto para imaginar cómo se implementaría :-) Además, la semántica parece que sería complicado; ¿Acabas de obtener una entrada de comodín? ¿Qué sucede si establece su valor en el número 37 en lugar de en una función? – Pointy

Respuesta

16

Usted está buscando __noSuchMethod__:
JavaScript getter for all properties

+0

Hmmm ... Lo intenté '__noSuchMethod__: function() {alert ('caught it')},' pero no se está llamando. – user113716

+1

firma incorrecta: '__noSuchMethod__: function (id, args)' –

+1

Interesante ... se llama cuando uso Firefox, pero no Safari. – user113716

17

se puede crear un objeto JavaScript con 'catch-all' llaves usando un proxy y una función getter 'comodín' o. A diferencia de las soluciones aportadas, un proxy debería funcionar en casi cualquier entorno, incluyendo Node.js

var foo = new Object() 

var specialFoo = new Proxy(foo, { 
    get(target,name) { 
     // do something here 
     return name 
    } 
}) 

console.log(specialFoo.blabla) // this will output "blabla" 

Si desea que las propiedades sean exigibles, devuelva una función:

var specialFoo = new Proxy(foo, { 
    get(target,name) { 
     return function() { 
      console.log('derp') 
      return name 
     } 
    } 
}) 


specialFoo.callMe() // this will print derp 

Detalles: documentation on mozilla

Cuestiones relacionadas