valor una tipos script retornar otra funciones funcion ejemplos dentro definicion anonimas javascript syntax prototype-programming

tipos - retornar valor de una funcion javascript



Funciones de instancia de JavaScript versus funciones de prototipo (4)

Posible duplicado:
Uso de ''prototipo'' vs. ''esto'' en Javascript?

Mi comprensión de los diferentes tipos de funciones de JavaScript es la siguiente:

function MyObj() { this.propOne = true; this.publicInstanceFunc = function() { if (propOne) return ''public instance function''; } function privateFunc() { return ''private function only visible inside this constructor''; } } MyObj.prototype.protoFunc = function() { if (this.propOne) return ''prototype function shared amongst all instances of MyObj''; }

  1. ¿Son estos correctos?
  2. ¿En qué casos debería uno poner funciones en el prototipo (ej. protoFunc ) vs. en el constructor (ej. publicInstanceFunc )?
  3. ¿Está utilizando this la forma correcta de acceder a las propiedades dentro de las funciones del prototipo?

¿Son estos correctos?

Errar. Bueno, depende de lo que quieras hacer. No hay un modelo canónico aceptado para implementar la herencia de clase / estilo de instancia en JavaScript.

Pero esto:

if (propOne)

Probablemente sea un error, ya que this.propOne es una propiedad del objeto owner, mientras que propOne en sí mismo es una variable que no ha sido declarada (esto por defecto es una variable global, pero generalmente es una incorrección).

¿En qué casos debería uno poner funciones en el prototipo (ej. ProtoFunc) vs. en el constructor (ej. PublicInstanceFunc)?

Una función establecida en el prototipo es la misma función compartida entre todos los objetos. La única forma en que puede averiguar a qué instancia pertenece es leyendo ''esto'' cuando se lo llama.

Una función establecida en ''this'' en el constructor es una función nueva para cada instancia de MyObj . Posiblemente pueda usar esto como una forma alternativa de vincularse al objeto propietario en función de cierres en lugar de ''esto'', lo que puede ahorrar la escritura de cosas vinculantes de funciones. Es un estilo diferente de orientación a objetos que normalmente no se mezclaría con el estilo basado en este.


1) Sí, tu código es correcto.

2) Utilizo funciones definidas dentro de la función constructora cuando quiero acceder a otros miembros definidos de forma privada dentro del alcance de la propia función constructora, por ejemplo, cuando desea crear métodos privilegiados .

Las funciones públicas definidas en la función constructora son más costosas desde el punto de vista informático que la adición de una función simple al prototipo del objeto, pero también le dan mucha más flexibilidad.

3) Sí, si la propiedad es pública, puede acceder a ella utilizando la palabra clave this dentro de una función ampliada de prototipo, ya que this refiere a la instancia de su objeto.


Con respecto al segundo punto, extiendes el prototipo para que todos los objetos ya creados obtengan el nuevo método.

Además, le permite agregar métodos a los objetos incorporados (como agregar trim() a la string ).


En realidad, puede agregar otro nivel de privilegio al envolver todo en una función autoejecutable:

var MyObj = (function() { // scoping var privateSharedVar = ''foo''; function privateSharedFunction() { // has access to privateSharedVar // may also access publicSharedVar via explicit MyObj.prototype // can''t be called via this } function MyObj() { // constructor var privateInstanceVar = ''bar''; this.publicInstanceVar = ''baz''; function privateInstanceFunction() { // has access to all vars // can''t be called via this }; this.publicInstanceMethod = function() { // has access to all vars // also known as a privileged method }; } MyObj.prototype.publicSharedVar = ''quux''; MyObj.prototype.publicSharedMethod = function() { // has access to shared and public vars // canonical way for method creation: // try to use this as much as possible }; return MyObj; })();

Solo se puede acceder a las propiedades "públicas" desde el exterior a través de this .

Por razones de rendimiento, debe evitar lo que llamé métodos de "instancia": para cada uno de estos, se debe crear un nuevo objeto de función para cada instancia de MyObject , mientras que solo hay un único objeto de función por método "compartido".