ejemplos - Obtención de JavaScript para todas las propiedades
title css (7)
Lo más cerca que puede encontrar es __noSuchMethod__ , que es el equivalente de JavaScript de __no llamada () de PHP.
Desafortunadamente, no hay un equivalente de __get / __ set, lo cual es una pena, porque con ellos podríamos haber implementado __noSuchMethod__, pero todavía no veo una forma de implementar propiedades (como en C #) usando __noSuchMethod__.
var foo = {
__noSuchMethod__ : function(id, args) {
alert(id);
alert(args);
}
};
foo.bar(1, 2);
Para resumir: estoy en una situación en la que me gustaría obtener un getter estilo PHP, pero en JavaScript.
Mi JavaScript se ejecuta solo en Firefox, así que el JS específico de Mozilla está bien para mí.
La única forma que puedo encontrar para hacer un getter JS requiere especificar su nombre, pero me gustaría definir un getter para todos los nombres posibles. No estoy seguro si esto es posible, pero me gustaría saberlo.
Si está buscando algo como la función __get()
PHP, no creo que Javascript proporcione ninguna construcción de este tipo.
Lo mejor que puedo pensar es hacer un bucle a través de los miembros no funcionales del objeto y luego crear una función correspondiente "getXYZ ()" para cada uno.
En el falso código pseudo-ish:
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"
};
}
}
Si está codificando en ES6, puede combinar proxy y clase para tener un código atractivo como php :
class Magic {
constructor () {
return new Proxy(this, this);
}
get (target, prop) {
return this[prop] || ''MAGIC'';
}
}
esto se une al controlador, por lo que puede usar esto en lugar de destino.
Nota: a diferencia de PHP, el proxy maneja toda la solicitud de propiedad.
let magic = new Magic();
magic.foo = ''NOT MAGIC'';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC
Puede verificar qué navegadores son compatibles con el proxy http://caniuse.com/#feat=proxy y la clase http://caniuse.com/#feat=es6-class . El nodo 8 admite ambos.
Si realmente necesita una implementación que funcione, podría "hacer trampa" en su camino probando el segundo parámetro en contra de undefined
, esto también significa que podría usar get para establecer realmente el parámetro.
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;
}
}
};
Terminé usando una respuesta de nickfs para construir mi propia solución. Mi solución creará automáticamente las funciones get_ {propname} y set_ {propname} para todas las propiedades. Verifica si la función ya existe antes de agregarlos. Esto le permite anular el método de obtención o configuración predeterminado con nuestra propia implementación sin el riesgo de sobrescribirlo.
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;
};
}
})();
}
}
Javascript 1.5 tiene azúcar sintáctico getter/setter . John Resig lo explica muy bien here
No es lo suficientemente genérico para el uso de la web, pero ciertamente Firefox los tiene (también Rhino, si alguna vez quieres usarlo en el lado del servidor).
Proxy
puede hacerlo! ¡Estoy tan feliz de que esto exista! Aquí se da una respuesta: ¿hay un equivalente de JavaScript del método __getattr__ de python? . 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 para la victoria! Consulte los documentos de MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
Funciona en chrome, firefox y node.js. Desventajas: no funciona en IE - freakin IE. Pronto.