Finalmente, JS tendrá capacidad de proxy incorporada, que tendrá acceso de bajo nivel a todo tipo de cosas que suceden en segundo plano, que nunca estarán expuestas a los desarrolladores de aplicaciones (excepto a través del proxy - pensar métodos mágicos en lenguajes como PHP).
En ese momento, escribir un método destructor en su objeto, que decrementa el contador, podría ser completamente trivial, siempre y cuando el soporte para la destrucción/recolección de basura como activador esté 100% garantizado en todas las plataformas.
La única manera de momento, de forma fiable qué podría ser algo así como la creación de un registro cerrado de todas las instancias creadas, y luego manualmente destructing ellos (de lo contrario, nunca será recolección de basura).
var Obj = (function() {
var stack = [],
removeFromStack = function (obj) {
stack.forEach(function (o, i, arr) {
if (obj === o) { arr.splice(i, 1); }
makeObj.count -= 1;
});
};
function makeObj (name) {
this.sayName = function() { console.log("My name is " + this.name); }
this.name = name;
this.explode = function() { removeFromStack(this); };
stack.push(this);
makeObj.count += 1;
}
makeObj.checkInstances = function() { return stack.length; };
makeObj.count = 0;
return makeObj;
}());
// usage:
var a = new Obj("Dave"),
b = new Obj("Bob"),
c = new Obj("Doug");
Obj.count; // 3
// "Dave? Dave's not here, man..."
a.explode();
Obj.count; // 2
a = null; // not 100% necessary, if you're never going to call 'a', ever again
// but you MUST call explode if you ever want it to leave the page's memory
// the horrors of memory-management, all over again
¿Este patrón hará lo que usted quiere que haga? Mientras:
- no se presenta
a
en otra cosa
- no sobrescribir su método
explode
- que no se metan con
Obj
de ninguna manera
- usted don' t esperar que cualquier método
prototype
tenga acceso a cualquiera de las variables internas
... entonces sí, este método funcionará bien para hav el mostrador funciona correctamente. Incluso se podría escribir un método general convocada recycle
, que llama al método de cualquier objeto que se pasa explode
(siempre y cuando su constructor, o de la fábrica, con el apoyo tal cosa).
function recycle (obj) {
var key;
obj.explode();
for (key in obj) { if (obj.hasOwnProperty(key)) { delete obj[key]; } }
if (obj.__proto__) { obj.__proto__ = null; }
}
Nota: esto no eliminará el objeto. Lo habrá eliminado del cierre y eliminado todos los métodos/propiedades que alguna vez tuvo.
Así que ahora es una cáscara vacía, que puede reutilizar, establecer expresamente en null
después de reciclar sus partes, o dejar que se recoja y olvidarse de ella, sabiendo que ha eliminado las referencias necesarias.
¿Le resultó útil? Probablemente no.
La única vez que realmente veo esto como de utilidad sería en un juego donde tu personaje solo podría disparar 3 balas a la vez, y no puede disparar un 4 hasta que aparezca el 1er en la pantalla alguien o se sale del límite (así es como, digamos, Contra trabajó, en el día).
También podría cambiar una viñeta "desaparecida" de la pila y reutilizar esa bala para cualquier jugador/enemigo restableciendo su trayectoria, restableciendo las banderas correspondientes y empujándola nuevamente a la pila.
Pero, de nuevo, hasta que los proxies nos permitan definir los métodos constructor/destructor "mágico", que se respetan a bajo nivel, esto solo es útil si se va a microgenerizar la creación y destrucción de todos los suyos propios objetos (realmente no es una buena idea).
¿Qué ocurre cuando un objeto sale del ámbito? –
No agregue una variable global como contador, agregue una propiedad a 'MyObj.prototype' o' MyObj', o agregue una variable privada a través de un cierre. (Ninguno de los cuales resuelve el problema mencionado por Lee Taylor). – nnnnnn