2012-05-15 11 views
9

Por favor, ¿alguien me puede decir qué hace this.init.apply(this, arguments) en el código de abajo?qué significa este uso de apply() en Javascript

Entiendo lo que apply() hace en general, pero en el contexto del siguiente código, ¿qué está haciendo allí?

var Class = function() { 

    var klass = function() { 
     this.init.apply(this, arguments); //I don't really get this bit... 
    }; 

    klass.prototype.init = function(){}; 

    return klass; 
}; 

var Person = new Class; 

//Usage 
var someone = new Person; 

Veo a mucha gente usándolo. Tengo una idea de lo que hace, pero no puedo ponerle las manos encima, así que necesito más luz.

Subo un nivel extra en JS, así que quiero saber todo sobre él, no solo el simple nivel 'Hola mundo'.

Muchas gracias

+5

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply – SLaks

+2

posible duplicado de la pregunta [Apply() para javascript] (http://stackoverflow.com/questions/4638450/apply -question-for-javascript) – kapa

+4

¿Había algo poco claro acerca de cómo se describió el método cuando lo buscó en Google? – Jeff

Respuesta

9

apply es una función miembro de de un objeto función. Supongamos que tenemos:

entonces podemos utilizar:

saySomething.apply(document, ["hello", "goodbye"]); 

Este llama a la función y suministra los valores de la matriz como argumentos de la función. El primer argumento species el contexto de la función (o, lo que this es igual a cuando se ejecuta la función).

También debe tener en cuenta que arguments es una variable especial que contiene una matriz de todos los argumentos pasados ​​a la función. Por lo tanto, aquí, this.init.apply(this, arguments) significa que se llama a la función init y pasó todos los argumentos que se pasaron al constructor klass.

En una implementación real, creo que init esperarían argumentos. Considere cómo esto podría hacerse sin apply:

var klass = function(arg1, arg2, arg3) { 
    init(arg1, arg2, arg3); 
} 

klass.prototype.init = function(arg1, arg2, arg3) {} 

Si quiere añadir arg4 a init, tendría que añadir que en tres lugares! Al tener klass transparentemente pasar todos sus argumentos a init, hace que el código sea mucho menos frágil.

+0

Muchas gracias @apsillers. Pero ¿por qué está llamando 'init()' dentro de sí mismo? ¿Por qué no usar 'klass.prototype.init()'? Perdón por molestarte por esto, me gusta ser claro en las cosas ... – Shaoz

+2

Está diseñado para hacer 'klass' completamente transparente - aunque' klass' es lo que se llama al construir una nueva instancia, 'init' es la función que hace el verdadero "trabajo pesado" y puede esperar argumentos. Para ahorrarte el problema de duplicar una lista de argumentos en 'klass' y' init', 'klass' no toma argumentos con nombre y simplemente pasa todos los argumentos a' init' usando 'apply' y' arguments'. ¿Por qué se hizo de esta manera? No sé lo suficiente sobre la biblioteca Klass para decir. – apsillers

+0

Editado para mayor aclaración. – apsillers