2011-09-13 19 views
5
function Set() {   // This is the constructor 
    this.values = {};  
    this.n = 0;   
    this.add.apply(this, arguments); // All arguments are values to add 
} 

// Add each of the arguments to the set. 
Set.prototype.add = function() { 
    /* Code to add properties to the object's values property */ 
    return this; 
}; 

Este es el comienzo del código utilizado en "Javascript: The Definitive Guide" para crear una clase "Set". Intenté racionalizar la necesidad de la función apply() en el constructor pero no puedo resolverlo por mi cuenta.¿Por qué es necesaria la función apply() en el constructor

this.add.apply(this, arguments); 

si la función add() es ya un método llamado por 'this' entonces qué propósito o uso es la función básica apply() cumplimiento. Gracias de antemano a cualquier persona que trata de explicar esto a mí

http://jsfiddle.net/Marlin/Ydwgv/ - Ejemplo completo de Javascript: La guía definitiva

+0

Parece ser de poca utilidad. Nunca lo * visto * ... – Blender

+0

¿Qué piensas sobre el hecho de que están pasando el objeto de argumentos? – ChaosPandion

+0

¿No cree que podría tener algo que ver con asegurarse de que add() no se agregue como una propiedad de la instancia en lugar del prototipo? Entiendo que no está siendo declarado ... pero seguro me está confundiendo – Marlin

Respuesta

7

"si la función add() es ya un método llamado por 'esto' a continuación, ¿Con qué propósito o uso es el núcleo se aplica la función() cumpliendo. "

Para que el arguments se pueden transmitir como una colección entera. Útil si Set acepta un número indefinido de argumentos.

+0

De acuerdo, déjame ver si tengo esto entonces. add() acepta argumentos infinitos pero no acepta una colección. mediante el uso de apply() puede omitir esta restricción? – Marlin

+0

@Marlin En términos generales, sí ;-) Es de suponer que el cuerpo de 'add' itera sobre el objeto' arguments' y hace algo con cada elemento (donde cada elemento representa un parámetro con el que se invocó la función). –

+0

@Marlin: Sí, usando '.apply()', cualquiera que sea el número de argumentos individuales que se pasó a 'Set()', se pasarán a '.add()' como argumentos individuales. – user113716

2

No es necesario en el constructor - de hecho, tiene nada que ver con un constructor en general (pero obviamente es importante para este específico ;-). Lo que applyhace do es asegurar que la función de destino se invoque "correctamente".

Esto es, apply, cuando se les da un objeto * array-como (arguments recuentos), [n1, n2, ... n3] y una función f, se llamará a la función objetivo como f(n1, n2, ... n3). apply también toma el "contexto" que pasa el objeto recién creado en el código (para que parezca como si add se llamara "como un método normal"). Vea el enlace de arriba para más información/ejemplos.

Eso quiere decir, que para que el código anterior,

var s = new Set(1, 2, 3) 

y

var s = new Set() 
s.add(1, 2, 3) 

son equivalentes.

Happy coding.


* En FireFox anterior a 4 tenía que ser una Matriz propiamente dicha. Es por esto que a veces código utiliza la fea expresión idiomática:

f.apply(context, Array.prototype.slice.call(arguments, 0)) 
1

Creo que se está llamando no para el alcance, pero el hecho de que se aplica tomará una serie de argumentos y pasarlos a fin:

this.add.apply(this, [1,2,3,4]); 
.... 
function add(one, two, three, four) 
no

un único parámetro que es una matriz

+0

perfecto, aprecio la respuesta rápida – Marlin

1

el método de una función apply le permite invocar la función pasando un array en lugar de una lista de elementos.

Para ilustrar:

function add(a, b) { 
    return a+b; 
} 

var values = [1,2]; 

alert(add.apply(this, values)); 

alertará 3.


Así que, en esencia, lo que está haciendo no es lo que permite su constructor para tomar cualquier número de argumentos, y usted luego páselos todos a la función add en una sola toma.

lo tanto, si se va a llamar a su constructor:

var stack = new Set(1,2,3,4,5,6,7,8,9); 

todos esos valores serán pasados ​​a la función add, como si se hubiera escrito:

this.add(1,2,3,4,5,6,7,8,9); 
+0

perfecto, eso es exactamente lo que necesitaba saber. aprendí aplicar hace unos días, pensé que solo se usaba para llamar a métodos de diferentes objetos – Marlin

1

Utilizando el La sintaxis .apply() le permite pasar una matriz de argumentos a la función que se invoca. En este caso, está pasando el objeto arguments, lo que significa que está llamando al add() con todos y cada uno de los parámetros que se pasaron a la función Establecer constructor. Por lo que puede crear nuevos objetos de set con un número arbitrario de valores diciendo, por ejemplo,

var mySet = new Set(13,42,18,19,44,11,5); 

Y todos esos valores se pasó a través de add().

+0

gracias, mi lectura anterior de aplicar incluía esa explicación, pero se enfocaba más en su capacidad para llamar a un método desde un objeto diferente – Marlin

Cuestiones relacionadas