overloadSetter
overloadSetter
, junto con overloadGetter
, son dos métodos función decorador. La función overloadSetter
se usa para transformar funciones que tienen la firma fn(key, value)
en funciones que podrían aceptar argumentos de objeto, es decir: fn({key: value})
.
Para hacer esto, overloadSetter
debe envolver la función original. Esta función de contenedor tiene la firma fn(a, b)
, que es un atajo para fn(key, value)
. Esto efectivamente se convierte en la nueva versión sobrecargada de la función original.
Lo primero que hace esta función sobrecargada es comprobar si el argumento key
pasado (a
) es del tipo de cadena o no. Si no es una cadena, la función asume que estamos pasando un objeto. Por lo tanto, itera sobre cada par clave-valor en el objeto y le aplica la función original. Si es una cadena, por otro lado, simplemente aplica la función a los valores de los argumentos a
y b
.
Ejemplo
Para ilustrar, supongamos que tenemos la siguiente función:
var fnOrig = function(key, value){
console.log(key + ': ' + value);
};
var fnOver = fnOrig.overloadSetter();
fnOver('fruit', 'banana');
fnOver({'fruit': 'banana', 'vegetable': 'carrot'});
En la primera invocación, la función fnOver
se invoca con dos argumentos, una clave y un valor. Cuando la función comprueba el tipo del valor de argumento a
, verá que es una cadena. Por lo tanto, invocará simplemente la función original fnOrig
: fnOrig.call(this, 'fruit', 'banana')
. Nuestra salida de consola es 'fruit: banana'
.
Para la segunda invocación, se invoca la función fnOver
con un argumento de objeto. Como pasamos un objeto en lugar de una cadena, fnOver
iterará a través de los miembros de este objeto e invocará la función fnOrig
para cada uno de ellos. Por lo tanto, fnOrig
se invocarán dos veces en este caso: fnOrig.call(this, 'fruit', 'banana')
y fnOrig.call(this, 'vegetable', 'carrot')
. Nuestra salida de consola es 'fruit: banana'
y 'vegetable: carrot'
.
Extras
Dentro de la función de contenedor, verá que hay un cheque por el valor de usePlural
. Este es un argumento para el método overloadSetter
. Si establece este valor en true
, la nueva función tratará todos los argumentos como objetos. Esto significa que incluso si pasa un argumento de clave de cadena, aún se procesará como un objeto.
La otra cosa, el código enumerables
que preludia la declaración del método real, está ahí, ya que corrige un problema con algunos navegadores en el que los Object
métodos nativos no están enumerados en for/in
bucles incluso si el objeto en sí implementa su propia versión de ella .
aunque esto es algo poco probable de cambiar, debo señalar que este es un método privado/interno y escribir código que depende de la API puede no resistir el paso del tiempo (funciona en 1.3 por el momento) –
no documentado, entonces no hay promesas utilizar bajo su propio riesgo :) – seanmonstar
Gracias por la gran respuesta. @Dimitar, seanmonstar: Está bien, no estoy planeando usarlo, solo quería entender cómo funcionaba la función y qué hacía. –