Pregunta

En resúmen:. Estoy en una situación en la que me gustaría un captador de estilo PHP, pero en JavaScript

El código JavaScript se ejecuta en Firefox solamente, por lo que Mozilla específica JS está bien por mí.

La única manera en que puedo encontrar para hacer un captador JS requiere especificar su nombre, pero me gustaría definir un captador de todos posibles nombres. No estoy seguro de si esto es posible, pero me gustaría mucho saber.

¿Fue útil?

Solución

Proxy puede hacerlo! Estoy muy feliz de esto existe !! Una respuesta se da aquí: ¿Hay un equivalente de JavaScript __getattr__ del pitón método? . Para reformular en mis propias palabras:

var x = new Proxy({},{get(target,name) {
  return "Its hilarious you think I have "+name
}})

console.log(x.hair) // logs: "Its hilarious you think I have hair"

Proxy por la victoria! Echa un vistazo a la documentación MDN: https: //developer.mozilla .org / es-es / docs / web / JavaScript / Referencia / Global_Objects / Proxy

Obras en Chrome, Firefox, y node.js. Desventajas: no funciona en IE - IE puto. Pronto.

Otros consejos

Lo más cerca que se puede encontrar es __noSuchMethod__ , que es equivalente de __call de PHP de JavaScript ().

Por desgracia, no hay equivalente de __get / set __, que es una lástima, porque con ellos podríamos haber implementado __noSuchMethod__, pero todavía no vemos una forma de implementar propiedades (como en C #) usando __noSuchMethod __.

var foo = {
    __noSuchMethod__ : function(id, args) {
        alert(id);
        alert(args);
    }
};

foo.bar(1, 2);

Si está codificando en ES6 Puede combinar proxy y clase para tener un código de buen aspecto de php

class Magic {
    constructor () {
        return new Proxy(this, this);
    }
    get (target, prop) {
        return this[prop] || 'MAGIC';
    }
}

este se une al controlador, para que pueda utilizar este lugar de destino.

Nota:. A diferencia de PHP, proxy gestiona todas las peticiones propiedad

let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC

Puede comprobar qué navegadores soporte de proxy http://caniuse.com/#feat=proxy y la clase http://caniuse.com/#feat=es6-class . Nodo 8 apoyo ambos.

Javascript 1.5 tiene getter / setter azúcar sintáctico . Se explica muy bien por John Resig href="http://ejohn.org/blog/javascript-getters-and-setters/" aquí

No es lo suficientemente genérico para uso en la web, pero ciertamente Firefox ellos tiene (también Rhino, si alguna vez desea utilizarlo en el lado del servidor).

Si realmente necesita una aplicación que funciona, se puede "engañar" a su manera arround probando el segundo parámetro contra undefined, esto también significa que usted podría utilizar para obtener el parámetro de comienzo ajustada.

var foo = {
    args: {},

    __noSuchMethod__ : function(id, args) {
        if(args === undefined) {
            return this.args[id] === undefined ? this[id] : this.args[id]
        }

        if(this[id] === undefined) {
            this.args[id] = args;
        } else {
            this[id] = args;
        }
    }
};

Si usted está buscando algo así como PHP función __get() , no creo Javascript proporciona dicha construcción.

Lo mejor que puedo hacer es pensar en bucle a través de los miembros no la función del objeto y luego la creación de una función correspondiente "getXYZ ()" para cada uno.

En el código pseudo-ish poco fiable:

for (o in this) {
    if (this.hasOwnProperty(o)) {
        this['get_' + o] = function() {
            // return this.o -- but you'll need to create a closure to
            // keep the correct reference to "o"
        };
    }
}

Terminé usando la respuesta de un nickfs para construir mi propia solución. Mi solución creará automáticamente get_ {} propName y set_ {} PROPNAME funciones para todas las propiedades. No compruebe si la función ya existe antes de añadirlos. Esto le permite anular la petición GET o el método establecido con nuestra propia aplicación sin el riesgo de que sobreescritos.

for (o in this) {
        if (this.hasOwnProperty(o)) {
            var creategetter = (typeof this['get_' + o] !== 'function');
            var createsetter = (typeof this['set_' + o] !== 'function');
            (function () {
                var propname = o;
                if (creategetter) {
                    self['get_' + propname] = function () {
                        return self[propname];
                    };
                }
                if (createsetter) {
                    self['set_' + propname] = function (val) {
                        self[propname] = val;
                    };
                }
            })();
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top