O Duck Typing é um conceito em programação que se concentra no comportamento de um objeto em vez de sua classe ou tipo. Em outras palavras, se um objeto anda como um pato, nada como um pato e grasna como um pato, então é um pato. Em JavaScript, isso significa que podemos nos concentrar nas propriedades e métodos de um objeto em vez de seu tipo para determinar se ele pode ser usado em um determinado contexto. Um exemplo prático de Duck Typing em JavaScript pode ser visto em um construtor de objetos "Animal". Em vez de definir tipos específicos de animais, podemos definir propriedades e métodos que um animal deve ter para ser considerado um animal. Eis um exemplo:
// Construtor de Animal function Animal() {}
// Métodos do Animal Animal.prototype.sound = function() { console.log("Este animal faz um som"); }; Animal.prototype.move = function() { console.log("Este animal se move"); };
// Construtor de Cachorro function Cachorro() {}
// Protótipo do Cachorro Cachorro.prototype.sound = function() { console.log("O cachorro late"); };
// Construtor de Pato function Pato() {}
// Protótipo do Pato Pato.prototype.sound = function() { console.log("O pato grasna"); }; Pato.prototype.move = function() { console.log("O pato nada"); };
// Função que aceita qualquer Animal como argumento function fazerAnimalFazerAlgumaCoisa(animal) { animal.sound(); animal.move(); }
// Criando um Cachorro e um Pato var cachorro = new Cachorro(); var pato = new Pato();
// Chamando a função com o Cachorro e o Pato fazerAnimalFazerAlgumaCoisa(cachorro); fazerAnimalFazerAlgumaCoisa(pato);
Neste exemplo, temos um construtor de Animal que define os métodos "sound" e "move" que todos os animais devem ter. Em seguida, temos construtores de Cachorro e Pato que definem seus próprios métodos "sound" e "move". Quando chamamos a função "fazerAnimalFazerAlgumaCoisa" com o cachorro e o pato como argumentos, ambos são aceitos porque têm os métodos "sound" e "move" necessários para serem considerados animais. Isso é um exemplo de polimorfismo, onde objetos de diferentes tipos podem ser tratados como se fossem do mesmo tipo, desde que tenham o comportamento necessário.
Talvez seja a maneira mais fácil de visualizar o Duck Type utilizando um constructor e polimorfismo.