2010-07-31 5 views
43

Könnte mir jemand ein Beispiel für Duck Typing Vererbung in Javascript geben? Ich erkunde OO Javascript und ich habe über Ente Typisierung gehört, aber kann keine Beispiele dafür in Javascript verwendet werden.Duck Typing in Javascript

+3

Duck Typing nicht so gut in Javascript- Ihr Objekt funktioniert wie eine Gleitkommazahl quaken könnte, aber es kann nur sein, wie wahrscheinlich quatschen wie eine Schnur oder ein Boolean. – kennebec

+1

http://StackOverflow.com/a/12763070/822138 hat einige gute Beispiele und Diskussionen. – sam

Antwort

21

Der zweite Link gibt ein Beispiel für ein Duck-typing-ähnliches Muster in js. Nicht zu sagen, ich empfehle das, aber ... nun, du hast darum gebeten. ;)

In Computer-Programmierung mit objektorientierten Programmiersprachen, ist Duck Typing eine Art von dynamischer Typisierung, in dem ein Strom Reihe von Methoden und Eigenschaften des Objekts die gültige Semantik bestimmt, sondern als seine Vererbung von einer bestimmten Klasse oder Implementierung einer spezifischen Schnittstelle.

Wikipedia - Duck typing

Der einfachste Ansatz ist es, den Vertrag formlos und einfach auf die Entwickler an jeder Seite der Schnittstelle verlassen, um zu definieren, zu wissen, was sie tun. Dave Thomas hat diesen Ansatz den Namen "Ente Typisierung" -wenn es geht wie eine Ente und quakt wie eine Ente, dann ist es eine Ente gegeben. Ähnlich wie bei unserer Schnittstelle Shape, wenn es einen Bereich und einen Umfang berechnen kann, dann ist es ein Shape.

JavaScript Interfaces and Duck Typing

+0

Brilliant, danke für die Antworten. Jetzt verstehe ich, dass ich bei meiner Standardvererbung bleiben werde, indem ich die Prototypkette benutze. –

+0

Das js Beispiel in Wikipedia, prüft nicht für irgendwelche "Wege" und "Quacksalber" !! Sollte dieses Beispiel nicht aktualisiert werden? – eminemence

108

Die Regel der „Duck Typing“ ist

Wenn es aussieht wie eine Ente, schwimmt wie eine Ente und quakt wie eine Ente, dann ist es wahrscheinlich eine Ente.

In einer klassenbasierten objektorientierten Programmiersprache (C++, zum Beispiel) beiden Objekte wie eine Ente aussehen lassen Sie ihre Klassen von einer gemeinsamen „Schnittstelle“ Klasse erben müssen, so würden die Compiler können Sie anrufen duck Methoden auf ihnen. Das nennt man eine starke Typisierung.

Nun ist dies, wie es in Javascript getan:

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 

See, die check Funktion überprüfen, ob das übergebene Objekt aussieht wie eine Ente (er prüft Aussehen und seine Fähigkeit zu quaken). Wir übergeben zwei verschiedene Objekte und es wird true auf beiden zurückgeben. Neben dem Aussehen und dem Quaken können das völlig verschiedene Dinge sein, aber in dieser speziellen Funktion verhalten sie sich genauso (haben eine gemeinsame Schnittstelle), sie sehen beide wie eine "Ente" aus. Wir können die Methode quack für beide Objekte aufrufen (und wen kümmert es, was sie wirklich sind).

+4

Ich möchte auch auf diese Antwort ein grünes Häkchen sehen :-) Sauber und einfach – Thabung

+1

Sehr gute Antwort – Willa

+1

Sehr gut erklärt. Danke :) – rajugaadu

1

Ein Beispiel für die Eingabe von Enten in JavaScript sind iterables. JavaScript hat eigentlich keinen Typ namens Iterable, aber es hat eine Definition für ein Objekt, das iterierbar ist.

Um iterable zu sein, ein Objekt muss die @@ Iteratormethode

Dies ist die Voraussetzung für die Ente Typisierung implementieren. Wenn ein Objekt eine in einer Schnittstelle definierte Methode implementiert, kann das Objekt an Stellen verwendet werden, an denen der Schnittstellentyp akzeptiert wird. Für Iterables ist dies der Fall in Schleifen

for (let value of iterable) { 
} 

und Arrays

[...iterable] 
Verwandte Themen