2012-02-15 12 views
7

Tengo un objeto JavaScript que hace algo como esto - con ayuda de un cierre para simular privada frente a las funciones públicas/variables:JS prototipo vs cierre

var myCoolObject = function(x, y) { 

    var prop1 = "a cool prop1 value"; 
    var negX = x * -1; 
    var negY = y * -1; 
    var xyProduct = x * y; 

    return { 
     PublicProp1: prop1, 
     getXYProduct: function() { return xyProduct; }, 
     getNegX: function() { return negX; }, 
     getNegY: function() { return negY; } 
    } 
} 

Voy a crear alrededor de 4.000 casos de este objeto, y desde lo que estoy leyendo la adición de funciones a través de la prototype será más eficiente que la adición de ellos como lo he hecho anteriormente (ya que en mi ejemplo, cada instancia tendrá sus propias getXYProcust(), getNegX() y getNegY() funciones

mi pregunta es doble -. es mi enfoque anterior realmente "ineficiente"? Me doy cuenta de que ineficiente es un término relativo, pero es algo que probablemente notará. Si no es eficiente, ¿cómo agregaría esas funciones al prototype de myCoolObject? He intentado lo siguiente:

myCoolObject.prototype.protoProp = "pppp"; 
myCoolObject.prototype.getAtMeBro = function() { return "get at me bro"; }; 
var myInstance = new myCoolObject(5, 10); 

Pero ni protoProp ni 'getAtMeBro()' son propiedad de myInstance cuando inspeccionarlo.

Gracias de antemano por cualquier ayuda - ¡Lo aprecio!

+0

¿Cómo se ve el constructor ahora? Asegúrate de no devolver nada (o simplemente 'esto'). –

+0

No estoy seguro de entender la pregunta? el constructor se vería como el nuevo myCoolObject (5, 10) cuando lo instanciara. – MattW

+0

No, el constructor es la función que se usa con la palabra clave 'new', como' function myCoolObject() {} ' –

Respuesta

3
  1. El mejor consejo es probarlo y ver. En los motores JS modernos, debería encontrar que 4000 objetos son juegos de niños y no deberían ser un problema (siempre que cada uno de ellos no obtenga demasiado grande). Si tienes usuarios en IE6 y motores más antiguos, prepárate para que puedan hacer frente a menos.

    Como ejemplo, un avance de línea de tiempo de Facebook requiere ~ 4000 (3992 cuando probé) elementos DOM; cada uno de estos son más más complicado que los objetos que está creando (sin embargo, utilizan el método prototipo, pero tienen un lote más información).

  2. No puede aplicar el patrón de miembro privado cuando usa prototype, porque no puede crear un cierre para encapsular ambos. El patrón típico aquí es denotar a un miembro privado con una dirección _, insinuación en personas que no la usan (pero, por supuesto, no hay nada que les impida hacerlo).

+0

¡Gracias! Lo he intentado y no he notado mucho de un golpe de CPU o memoria, pero sigo publicando artículos que promueven el uso del prototipo, así que me pregunto si estoy cometiendo un error fundamental de diseño. Llamaré a la función getXYProduct() para todos los 4000 objetos en algún intervalo de temporizador, unos 50 segundos, que todavía no ha causado mucho golpe de rendimiento. En cuanto al # 2, ¿está diciendo que no use un cierre si quiero usar un prototipo, simplemente cambie el nombre de mis locales para comenzar con un _ y ponga comentarios amenazadores/atemorizantes para advertir a las personas que no los usen? – MattW

+1

Lo bueno de cambiar a un enfoque de prototipo no debería ser * demasiado * esfuerzo. Y sí, para el n. ° 2 terminarán siendo métodos públicos, pero su temible comentario y su _ _ encabezado deberían hacer que las personas no los usen. – Matt

+0

¡Gracias por la entrada! – MattW

Cuestiones relacionadas