2010-07-31 8 views
43

¿Podría alguien darme un ejemplo de Duck Typing inheritance en Javascript? Estoy explorando OO javascript y he escuchado sobre el pato de tipeo, pero no veo ejemplos de su uso en javascript.Duck Typing en Javascript

+3

pato a escribir no funciona tan bien en Javascript- el objeto podría graznar como un número de coma flotante, pero puede ser tan probablemente graznar como una cuerda o un booleano. – kennebec

+1

http://stackoverflow.com/a/12763070/822138 tiene algunos buenos ejemplos y discusión. – sam

Respuesta

21

El segundo enlace muestra un ejemplo de un patrón tipo pato en js. No digo que recomiendo hacer esto, pero ... bueno, lo pediste. ;)

En la programación de ordenador con lenguajes de programación orientados a objetos, duck typing es un estilo de dinámica escribir en el cual la corriente conjunto de métodos y propiedades de un objeto determina la semántica válidos, en lugar que su herencia de una clase particular o implementación de una interfaz específica .

Wikipedia - Duck typing

El método más sencillo es definir el contrato manera informal y simplemente se basan en los desarrolladores en cada lado de la interfaz saber lo que están haciendo. Dave Thomas le ha dado a este enfoque el nombre de "pato escribiendo" -si anda como un pato y grazna como un pato, , entonces es un pato. De manera similar con nuestra interfaz Shape, si se puede calcular un área y un perímetro, entonces es un Shape.

JavaScript Interfaces and Duck Typing

+0

Brillante, gracias por las respuestas. Ahora comprendo, creo que voy a mantener mi herencia estándar usando la cadena de prototipos. –

+0

¡El ejemplo js en wikipedia no verifica "paseos" y "charlatanes"! ¿No debería ese ejemplo ser actualizado? – eminemence

108

La regla de "Duck Typing" es

Si se ve como un pato, nada como un pato, y grazna como un pato, entonces probablemente es un pato.

En un lenguaje basado en clases programación orientada a objetos (C++, por ejemplo) para que ambos objetos se ven como un pato debe heredar sus clases de una clase de "interfaz" común, por lo que el compilador le permiten hablar duck métodos en ellos. Eso se llama tipeo fuerte.

Ahora bien, esto es cómo se hace en Javascript:

var duck = { 
    appearance: "feathers", 
    quack: function duck_quack(what) { 
     print(what + " quack-quack!"); 
    }, 
    color: "black" 
}; 

var someAnimal = { 
    appearance: "feathers", 
    quack: function animal_quack(what) { 
     print(what + " whoof-whoof!"); 
    }, 
    eyes: "yellow" 
}; 

function check(who) { 
    if ((who.appearance == "feathers") && (typeof who.quack == "function")) { 
     who.quack("I look like a duck!\n"); 
     return true; 
    } 
    return false; 
} 

check(duck); // true 
check(someAnimal); // true 

Sede, la función check comprobar si el objeto pasado parece un pato (comprueba apariencia y su capacidad de charlatán). Le pasamos dos objetos diferentes y devolverá true en ambos. Además de la apariencia y el graznar, estas cosas pueden ser completamente diferentes, pero EN ESTA PARTICULAR función check se comportan de la misma manera (tienen una interfaz común), ambas parecen un "pato". Podemos llamar al método quack en ambos objetos (y a quién le importa lo que realmente son).

+4

Deseo ver el tic verde en esta respuesta también :-) Limpio y simple – Thabung

+1

Muy buena respuesta – Willa

+1

Muy bien explicado. Gracias :) – rajugaadu

1

Un ejemplo para pato escribir en JavaScript es iterables. JavaScript no tiene ningún tipo llamado Iterable, pero tiene una definición para un objeto, que es iterable.

Con el fin de ser iterable, un objeto debe implementar la @@ método iterador

Este es el requisito para la tipificación de pato. Si un objeto implementa un método, definido en una interfaz, el objeto se puede usar en lugares, donde se acepta el tipo de interfaz. Para iterables este es el caso en los bucles

for (let value of iterable) { 
} 

y matrices

[...iterable]