objetos - object object javascript
Supervise todas las propiedades de objeto de JavaScript(captadores de magia y establecedores) (3)
Al examinar el código fuente de nowjs, creo que lo hacen supervisando continuamente el objeto now
y promoviendo cambios entre el cliente y el servidor cada vez que se detectan. Sin embargo, admito que aún no he descifrado por completo su código.
En un navegador, esto se haría con algunos hacks setInterval
divertidos.
EDITAR : sí, eso es lo que hacen: línea 368 del cliente now.js
Hacen algunos trucos más para que una vez que se detecte una nueva propiedad, el acceso futuro sea capturado por getters y setters, pero esas modificaciones solo se realizan cada 1000 ms en un setTimeout
.
Otra evidencia de que esto es imposible en el JavaScript actual es que here está diseñada explícitamente para permitir tales escenarios, lo que implica que no pueden hacerse actualmente. Los navegadores recientes de Mozilla tienen una implementación prototipo de proxies , si acaso eso es suficiente. Y aparentemente V8 está trabajando para agregar soporte , lo cual podría ser suficiente dependiendo de qué versión de V8 Node esté usando actualmente.
EDIT2 : oh genial, en el lado del servidor aparentemente nowjs usa proxies! Lo que probablemente significa que están lo suficientemente maduros en Node para su uso. Vea lo que hacen en https://github.com/Flotype/now/blob/master/lib/proxy.js . O simplemente haga var Proxy = require("nodejs-proxy")
y espere que sigan las especificaciones para que pueda aprovechar la documentación de MDC y de otros lugares.
¿Cómo emulo PHP-style __get () y __set () magic getter / setters en JavaScript? Mucha gente dice que esto es actualmente imposible. Estoy casi seguro de que es posible porque proyectos como nowjs ( http://nowjs.com ) hacen algo como esto.
Sé que puede utilizar get y set , pero estos no funcionan cuando no está seguro de cuál será el nombre de la propiedad. Por ejemplo, ¿qué pasaría si quisiera que un controlador de eventos se ejecute cuando se crea una nueva propiedad ?
Ejemplo de lo que me gustaría hacer:
var obj = {};
notify(obj, function(key, value) {
//key is now the name of the property being set.
//value is the value of the property about to be set
console.log("setting " + key + " to " + value);
});
obj.foo = 2; //prints "setting foo to 2"
obj.bar = {a: 2}; //prints "setting bar to [Object]"
//Notice that notify() worked even though ''foo'' and ''bar'' weren''t even defined yet!
(La pregunta es similar a las siguientes preguntas:
- ¿Hay alguna forma de controlar los cambios en un objeto?
- Obtención de JavaScript para todas las propiedades
)
EDITAR: Parece que esta función se denomina "proxies dinámicos" y debe aparecer en el estándar "Harmony" de ECMAScript (probablemente ES6). Puedes leer más here . Se introduce un nuevo Objeto ''Proxy'' con un par de métodos (es decir, Create () y createFunction ()).
Uno podría hacer esto:
//Constructing an object proxy (proto is optional)
var proxy = Proxy.create(handler, proto);
proxy.foo = 2; //Triggers ''set'' function in the handler (read about it)
En pocas palabras aquí: no funciona en la mayoría de los navegadores, pero hay una implementación disponible para Node.js: node-proxy .
En Firefox, puedes usar Object.watch . Si miras este hilo, Object.watch () para todos los navegadores? , hay un ejemplo de usar algo así en todos los navegadores.
Ooops, me acabo de dar cuenta de que quieres ver todas las propiedades, no una propiedad específica ... La solución anterior es mirar una propiedad específica.
Tal vez esta publicación podría ayudar ...? Sin embargo, eso es solo para propiedades específicas y navegadores basados en Gecko ... Si necesita soporte para otros navegadores, tiene errores, pero podría mirar en el intercambio de propiedades. Aquí está la página de MSDN . Espero que esto ayude un poco...