2010-07-31 6 views
43

Quelqu'un pourrait-il me donner un exemple de l'héritage de Duck Typing en Javascript? J'explore OO javascript et j'ai entendu parler de la dactylographie, mais je ne vois pas d'exemples de ce qui est utilisé en javascript.Canard taper en Javascript

+3

frappe de canard ne fonctionne pas si bien dans javascript- votre objet pourrait charlatan comme un nombre à virgule flottante, mais il peut être tout aussi susceptible de coincer comme une ficelle ou un booléen. – kennebec

+1

http://stackoverflow.com/a/12763070/822138 a quelques bons exemples et discussion. – sam

Répondre

21

Le deuxième lien donne un exemple de canevas de type canard dans js. Je ne dis pas que je recommande de faire ça, mais ... eh bien, vous l'avez demandé. ;)

En programmation avec des langages de programmation orientés objet , frappe de canard est un style de dynamique frappe dans lequel ensemble actuel d'un objet des méthodes et des propriétés détermine la sémantique valide plutôt que son héritage d'une classe particulière ou implémentation d'une interface spécifique .

Wikipedia - Duck typing

L'approche la plus simple est de définir le contrat officieusement et simplement se fier les développeurs de chaque côté de l'interface de savoir ce qu'ils font. Dave Thomas a donné cette approche le nom de "dactylographie" -si il marche comme un canard et il fait des charlatans comme un canard, alors c'est un canard. De même, avec notre interface Shape, si elle peut calculer une zone et un périmètre, alors il s'agit d'un Shape.

JavaScript Interfaces and Duck Typing

+0

Brillant, merci pour les réponses. Maintenant que je comprends, je pense que je vais m'en tenir à mon héritage standard en utilisant la chaîne du prototype. –

+0

L'exemple js dans wikipedia, ne vérifie pas les "marches" et "charlatans" !! Cet exemple ne devrait-il pas être mis à jour? – eminemence

108

La règle de « Duck Typing » est

Si elle ressemble à un canard, nage comme un canard et caquette comme un canard, alors il est probablement un canard.

Dans un langage de programmation orienté objet basé sur la classe (C++, par exemple) pour faire les deux objets ressemblent à un canard vous devez hériter de leurs cours d'une classe « d'interface » commune, de sorte que le compilateur vous laisser appeler duck méthodes sur eux. C'est ce qu'on appelle un typage fort.

Maintenant, c'est comment faire 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 

Voir, la fonction check vérifier si l'objet passé ressemble à un canard (il vérifie l'apparence et sa capacité de charlatan). Nous lui passons deux objets différents et il renverra true sur les deux. Outre l'apparence et le charlatanage, ces choses peuvent être complètement différentes, mais dans cette fonction particulière elles se comportent de la même façon (ont une interface commune), elles ressemblent toutes deux à un "canard". Nous pouvons appeler la méthode quack sur les deux objets (et qui se soucie de ce qu'ils sont vraiment).

+4

Je souhaite voir la coche verte sur cette réponse aussi :-) Propre et simple – Thabung

+1

Très bonne réponse – Willa

+1

Très bien expliqué. Merci :) – rajugaadu

1

Un exemple de typage de canard en JavaScript est iterables. JavaScript n'a en réalité aucun type appelé Iterable, mais il a une définition pour un objet, qui est itérable.

Pour être itératives, un objet doit implémenter la méthode @@ iterator

Ceci est l'exigence de frappe de canard. Si un objet implémente une méthode, définie dans une interface, l'objet peut être utilisé dans des endroits où le type d'interface est accepté. Pour iterables cela est le cas dans les boucles

for (let value of iterable) { 
} 

et tableaux

[...iterable] 
Questions connexes