2014-01-24 3 views
9

Gerade fertig gelesen "JavaScript: Die guten Teile" - Tolles Buch. Aber ich bin verwirrt über ein sehr wichtiges Thema auf Seite 33-34 - Typen erweitern. Es beschreibt die Erstellung einer neuen Methode, die zu Function.prototype hinzugefügt wurde. Wenn sie mit einer neuen Methode aufgerufen wird, steht diese Methode allen Funktionen zur Verfügung. Meinetwegen. Die folgenden Beispiele zeigen jedoch, dass diese Methode für Zahlen und Zeichenfolgen verwendet wird. Was ich denke, sind Objekte - keine Funktionen. Was fehlt mir hier?JavaScript - Die guten Teile: Funktionsprototypen gegen Objektprototypen

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Anwendungsbeispiel:

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceiling' : 'floor'](this); 
}); 

document.writeln((-10/3).integer()); //-3 
+6

Funktionen sind Objekte. –

+1

@MattBall Ich denke nicht, dass das der OP fragt. Eher denke ich, er/sie fragt, wie "Zahl" von "Funktion" abgeleitet wird. – mc10

+0

Ja, genau @ mc10. – svenyonson

Antwort

8

Sie eine Methode zum Number Prototyp hinzuzufügen, so dass jede Anzahl Instanz Zugriff darauf hat. Mit anderen Worten, da es im Prototyp "Number" eine Eigenschaft namens "integer" gibt, ist jeder Versuch, von einer beliebigen Number-Instanz auf diese Eigenschaft zuzugreifen, erfolgreich. Das ist der Sinn von Eigenschaften auf einen Konstruktorprototyp zu setzen.

Wenn eine JavaScript-Primitivnummer auf der linken Seite eines .-Operators angezeigt wird, wird sie von der Sprache automatisch in eine Number-Instanz eingeschlossen, sodass der Methodenaufruf sinnvoll ist.

bearbeiten — Lassen Sie uns sehen, wie diese "Methode" -Funktion funktioniert. Im Anruf

Number.method("integer", function() { ... }) 

was ist los? Nun, innerhalb der Funktion "method" ist der Parameter "name" "integer". Der Funktionsparameter wird dann als Eigenschaft von this.prototype zugewiesen. Was ist this in diesem Aufruf der Funktion "Methode"? Es ist die Zahl-Konstruktor-Funktion. Daher fügt die Funktion "method" —, die sich auf dem Prototyp Function befindet und daher für alle Funktionsinstanzen verfügbar ist, wie die Funktion Number constructor beispielsweise — die angegebene Funktion als eine Eigenschaft des Prototyps der betreffenden Konstruktorfunktion hinzu.

Warum ist die Eigenschaft "method" als Eigenschaft des Konstruktors Number sichtbar? Weil der Zahlenkonstruktor selbst eine Funktion ist. Die "method" -Funktion wurde als eine Eigenschaft des Function-Prototyps erstellt, was bedeutet, dass sie für jede Funktionsinstanz — einschließlich des Number-Konstruktors sichtbar ist.

+0

Ja, aber wie wird es dem Number-Prototyp hinzugefügt, wenn 'function.prototype' 'method' hinzugefügt wurde? Ich könnte verstehen, ob 'Methode' zu Object.prototype hinzugefügt wurde. – svenyonson

+1

@svenyonson 'Nummer' ist eine Funktion. Versuchen Sie dies in Ihrer Browser-Konsole: 'typeof Number' –

+0

@svenyonson Wie Matt Ball sagt, ist der Number-Konstruktor selbst eine Funktionsinstanz. – Pointy

8

Funktion Objekt vs Funktion Instanzobjekt

Vor allem in Javascript, ist eine Funktion auch ein Objekt. Darunter verstehe ich nicht das von new() konstruierte Objekt, sondern die Funktion selbst. Um Verwechslungen zu vermeiden, würde ich solche Objekte als Funktionsobjekt bezeichnen, und für Objekte, die mit dem new() - Konstrukt einer Funktion erstellt wurden, wie Funktion Instanzobjekt.

_ _ Proto und Prototyp Eigenschaften

Jedes Funktionsobjekt in Javascript hat zwei Eigenschaften: _ _ Proto und Prototyp.Darüber hinaus Funktion Instanz Objekt (erstellt mit neuen Konstruktor) hat eine Eigenschaft _ proto _. Die _ proto _ ist, was die Vererbung definiert. Einige gute Ressource auf diese könnten bei

http://zeekat.nl/articles/constructors-considered-mildly-confusing.html

finden Wie wird Vererbung definiert?

Ein Objekt objA erbt ein anderes Objekt ObjC wenn objA ObjC und durch eine beliebige Anzahl von _ _ proto verbunden sind. Wenn also objA _proto _ gleich objB ist und objB _proto _ gleich objC hat, dann erbt objA objB und objC, während objB objC erbt.

Was ist mit Vererbung gemeint?

Es bedeutet jede Vererbungs Objekt kann Verwendung jede Eigenschaft geerbt Objekt.

Was ist Function.prototype

Es ist das Ziel, den _ _ Proto jeder Funktionsobjekt bezieht. Das bedeutet, dass jedes Funktionsobjekt Zugriff auf Eigenschaften von Function.prototype hat, da jedes Funktionsobjekt Function.prototype Objekt erbt. Dies bedeutet auch, dass, wenn Methode Eigenschaft zu Function.prototype Objekt hinzugefügt wird, es für alle möglichen Funktionsobjekte in Javascript verfügbar wäre. Dazu gehören Strings, Number usw.

this.prototype [Name] = func;

dies bezieht sich auf Funktion Objekt, wenn die ‚Methode‘ von Function-Objekt aufgerufen wird s wie Number, String usw. Was bedeutet, dass wir jetzt eine neue Eigenschaft in Funktion Objekt mit Namen "Name", und es ist eine Funktion "func".

gut Was Objekt Prototyp Eigenschaft Funktion ist

A Funktionsobjekt 's Prototyp wird durch die Funktion Instanzobjekt bezeichnet' s _ proto _ erstellt mit dem neuen Konstrukt dieser Funktion.

wenn die folgenden ausgeführt wurde:

Number.method ('integer', function() {...});

dann Number.prototype hat, dass integer Verfahren darin definiert. Dies bedeutet jede Nummer Funktionsinstanzobjekt, z.B. new Number (2.4) würde diese neue Eigenschaft 'integer' von Number.prototype "erben", da die function instance object ihre _proto _ auf Number.prototype setzen würde.

0

Number oder Object oder eine andere eingebaute Klasse ist auch ein Konstruktor, dann Konstruktor ist eine Funktion in JavaScript. Es gibt Schlepptau wichtige Beschreibung in ECMAScript-Spezifikation:

Jede eingebaute Funktion und jeden Einbau-Konstruktor hat die Funktion Prototyp-Objekt, das der Anfangswert des Ausdrucks Function.prototype ist (15.3.4), wie der Wert seiner internen Eigenschaft [[Prototyp]].

Sofern nicht anders angegeben, verfügt jedes integrierte Prototypobjekt über das Object-Prototypobjekt, das den Anfangswert des Ausdrucks Object.prototype (15.2.4) als Wert seiner internen Eigenschaft [[Prototype]] besitzt das Object-Prototyp-Objekt selbst.

so in der Konsole, können wir den Code ausführen:

Number.prototype.__proto__.isPrototypeOf(Function)

das Ergebnis true ist.

so dass Number Zugriff auf die Function.prototype 's Methoden ist vernünftig.

Zur gleichen Zeit, wenn wir erweitern die Object.prototype als Object.prototype.say = 'hello';, können wir auch say als Function.say die Eigenschaft zugreifen.

Da Function.prototype.isPrototype(Object)true ist.

Verwandte Themen