objetos - Método del objeto JavaScript Encadenamiento: útil?
recorrer array de objetos javascript (9)
A todos los niños les encanta el encadenamiento. Sin embargo, en mi experiencia, debe usarse con cuidado ya que puede disminuir la legibilidad del código. En otras palabras, haga lo que tenga sentido para usted y pueda ser comprendido fácilmente por otros programadores que tienen una familiaridad básica con el concepto.
Entonces ... jugando con JavaScript con una idea que es nueva para mí, que los métodos de un objeto devuelvan el objeto del que son métodos; esto lleva a la encadenamiento. Mi pregunta, entonces: ¿cómo puede esto ser útil? Tiré esto juntos para probar el funcionamiento fundamental:
<script>
MathChain = function()
{
this.pass = function()
{
this.multiply = eval(arguments.join(''*''));
this.add = eval(arguments.join(''+''));
return this;
}
}
m = new MathChain().pass(5, 10, 20).multiply; // 1000
a = new MathChain().pass(5, 10, 20).add; // 35
</script>
Obviamente, esa no es una instancia viciosamente eficiente en la que uno usaría este concepto, así que ¿podría indicarme algo que lo haga correctamente (aparte de jQuery, por favor)?
Bueno, aquí hay un ejemplo no muy aplicable al mundo real, pero creo que obtendrás la idea. Si le permite realizar una serie de operaciones diferentes en un objeto, y proporciona comodidad.
var truck = function() {
this.turnLeft = function {
// turn left
return this;
}
this.turnRight = function {
// turn right
return this;
}
this.goReallyFast = function {
// go fast!
return this;
}
};
// My get-away plan
var myTruck = new truck();
myTruck.turnLeft().turnRight().goReallyFast();
El encadenamiento de JavaScript puede ser muy útil si desea realizar una serie de acciones en un solo objeto. Estoy de acuerdo con Michael Luton a continuación, el encadenamiento debe manejarse con cuidado. Si agrega uno o dos métodos encadenados a un objeto que todavía es legible. Si comienza a agregar cuatro, cinco o incluso nueve, entonces su código se vuelve más difícil no solo para leer sino para mantener.
En JavaScript, esto aparece todo el tiempo cuando se navega por el DOM. En particular, cuando trates de atravesar un montón de elementos que no tienen ID.
Por ejemplo, hubo una pregunta en SO sobre la búsqueda del primer elemento de una tabla . Puede involucrar muchos bucles o comandos encadenados.
Encontré esta pregunta mientras buscaba una solución general para hacer que los métodos fueran susceptibles de ser definidos, después de haberlos definido. Esto es lo que se me ocurrió. Soy un neófito de JavaScript; el comprador tenga cuidado.
makeChainable = function() {
var receiver = arguments[0]
for (var i = 1; i < arguments.length; i++) {
functionName = arguments[i];
(function() {
wrapped = receiver[functionName];
receiver[functionName] = function() {
wrapped.apply(receiver, arguments);
return receiver;
}
})();
}
}
daisy = {
name: ''Daisy'',
moo: function() { console.log(this.name + " moos!") }
}
makeChainable(daisy, ''moo'');
daisy.moo().moo().moo();
Interfaz fluida - http://en.wikipedia.org/wiki/Fluent_interface
Sí, creo que podría ser muy útil, pero como cualquier patrón de diseño, solo debe usarse cuando sea necesario
Editar: aquí está la api del cliente de twitter en c # usando una interfaz fluida - http://code.google.com/p/tweetsharp/
Para un ejemplo muy diferente (no OO), el encadenamiento es algo similar a las tuberías de Unix . Cada paso de una tubería Unix devuelve el contenido completo (modificado), adecuado para enviar al siguiente paso:
cat file1 file2 | sort -n | awk ''{print $2}'' | sed ''s/@/ at /g''
Si bien no funciona de la misma manera que su ejemplo (TBH, nunca antes lo había visto así), jquery considera que el "encadenamiento" es muy útil , y jquery es prácticamente la vara en estos días cuando se trata de JS web frameworks ... así que sí :-)
Un ejemplo en el que es útil es con una ligera variación en su problema: en lugar de devolver el mismo objeto, usted diseña el objeto para que sea inmutable . Luego, todas sus funciones devolverán una nueva instancia del mismo tipo, pero con las propiedades ya establecidas correctamente.
Esto tiene muchas aplicaciones prácticas, especialmente en el ámbito de la programación funcional.