2009-03-02 15 views
18

Así que ... jugar en JavaScript con una idea que es nueva para mí, tener métodos de un objeto devolver el objeto del cual son métodos; esto luego conduce a la chainable. Mi pregunta, entonces: ¿cómo puede ser útil esto? Tiré esto juntos para probar el funcionamiento fundamental:JavaScript Método del objeto Encadenamiento: ¿útil?

<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> 

Eso no es, obviamente, una instancia brutalmente eficiente en que se podría usar este concepto, por lo que me podría apuntar a algo que no lo hacen correctamente (aparte de jQuery, por favor)?

Respuesta

23

Bueno, aquí hay un ejemplo no muy aplicable en el mundo real, pero creo que entenderá. Si le permite realizar varias operaciones diferentes en un objeto, y le brinda 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(); 
+0

Heh, Me gusta; definitivamente demuestra un caso de uso potencial muy bien. Um ... ¿no es el uso en el mundo real, entonces, fuera de cómo se implementa en varias bibliotecas? –

+0

Hmmm, creo que entiendo a qué te refieres. ¿Estás llegando a la pregunta sobre la eficiencia? Siempre lo he visto por conveniencia. Sé que algunas personas piensan que el encadenamiento es menos legible que tener cada método en su propia línea. – jonstjohn

+0

@jonstjohn, me gustaría saber los pros y los contras para encadenar? –

8

Para un ejemplo muy diferente (no OO), el encadenamiento es algo similar a Unix pipelines. Cada paso de un tubo de Unix devuelve el contenido completo (modificado), adecuada para enviar a la siguiente etapa:

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g' 
6

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 que será inmutable. A continuación, todas sus funciones devolverán una nueva instancia del mismo tipo, pero con las propiedades ya configuradas adecuadamente.

Esto tiene muchas aplicaciones prácticas, especialmente en el ámbito de la programación funcional.

+0

Hm ... ¿sería eso devolver this.clone(), entonces? –

+0

um ... más o menos, pero no estoy seguro de que entiendas ese concepto todavía. Está bien: los objetos inmutables no son fáciles. Consulte la clase String de .Net para obtener un buen ejemplo para comenzar. –

+0

Este es un punto muy interesante que inicialmente se oculta a los principiantes en la programación. devolver un objeto a un nuevo objeto a veces no es aparente. El problema principal es que si no crea objetos nuevos, a veces esto conduce a identificadores que apuntan al mismo objeto, y los nuevos se confundirán cuando las dos "variables" cambien cuando solo hayan modificado una variable. – trusktr

1

En JavaScript esto aparece todo el tiempo cuando se navega por el DOM. En particular, cuando intentes abrirse paso entre un montón de elementos que no tienen identificadores.

Por ejemplo, hubo una pregunta sobre SO con respecto a finding the first element of a table. Puede implicar muchos bucles o comandos encadenados.

3

Si bien no funciona de la misma manera que su ejemplo (TBH nunca lo había visto hecho de esta manera), jquery considers "chaining" to be very useful, y jquery es el criterio en lo que respecta a los marcos web de JS. .. así que sí :-)

-2

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 otros programadores que tengan una familiaridad básica con el concepto pueden comprenderlo fácilmente.

+7

Perosonally no creo que dañe la legibilidad si los nombres de los métodos se nombran de una manera agradable. 'car.turnLeft(). turnRight(). goStraight(). stop();' no parece difícil de leer para mí. – trusktr

+0

El encadenamiento es una forma de mejorar la legibilidad. Por lo general, los desarrolladores piensan que algo es 'ilegible' cuando ven algo nuevo porque simplemente no están familiarizados con él. – E10

0

El encadenamiento de JavaScript puede ser muy útil si desea preformar 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 en 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.

3

Encontré esta pregunta mientras buscaba una solución general para hacer que los métodos se puedan encadenar, una vez definidos. 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(); 
Cuestiones relacionadas