JavaScript ist die zweite Programmiersprache, mit der ich nach C -Sprache in Kontakt gekommen bin. Während meines ersten Sommerurlaubs fand ich in der Bibliothek ein mit chinesisch geschriebenes JavaScript-Programm. Zu dieser Zeit war ich fast ein Anfänger im Programmieren. Darüber hinaus erwähnte das Buch den Programmiermechanismus von JavaScript überhaupt nicht, und es gab einige irreführende Wörter. Ich hatte immer ein tiefes Missverständnis von JavaScript und glaubte, dass JavaScript nur eine objektorientierte Sprache ist, die auf dem Browser ausgeführt wird. Ich werde diesen Artikel aufschreiben, der in JavaScript verwirrend und missverstanden ist. Natürlich gibt es aufgrund der begrenzten Ebene des Autors und ohne Entwicklungserfahrung unvermeidlich Auslassungen, und ich hoffe, dass Kritik und Korrektur vorgenommen werden.
JavaScript -Objekte
Was ist das Objekt?
Das neue Schlüsselwort ist überall im JavaScript -Code zu sehen, der leicht zu missverstehen ist, dass JavaScript eine Sprache ist, die auf Klassenvererbung basiert, genau wie Java. Dies ist jedoch nicht der Fall. Es gibt keine Klassen in JavaScript. Was ist also das Objekt von JavaScript, das keine Klasse ist? In gewissem Sinne sind JavaScript-Objekte Wörterbücher (Hash-Tabellen) in Python, und sie sind tatsächlich ähnliche Schlüsselwertpaare:
me = {"fisrtname": "such", "dachtname": "Wahrheit", "getName": function () {return this.firstname+this.lastName; // Dies entspricht einem Zeiger auf dieses Objekt}}Dies ist ein ziemlich Missverständnis. Als ich es zum ersten Mal sah, fühlte ich mich ein wenig unverständlich, aber ich fühlte es immer noch vernünftig, es sorgfältig zu verwenden. Wir können den [] Operator verwenden, um Elemente wie Python zu erhalten oder die zu verwenden. Bediener, um Elemente zu erhalten:
me.firstname // => seeeeMe ["lastname"] // => thushme.getName () // => seesshtruth
neuer Betreiber
Da es in JavaScript keine Klasse gibt, was macht der neue Betreiber? Dies ist einer der irreführendsten Aspekte des JavaScript -Designs. JavaScript ist eine funktionale Programmiersprache. Funktionen in JavaScript sind erstklassige Bürger, und Funktionen in JavaScript sind ebenfalls Objekte. Funktionsobjekte werden hinzugefügt, um Attribute zu rufen, wenn sie erstellt werden. Mehr Fallstrick ist, dass es zwei Möglichkeiten gibt, JavaScript -Funktionen aufzurufen. Einer besteht darin, mit dem neuen Keyword zu rufen, und der andere kann ohne das neue Keyword anrufen. Ersteres wird ein Objekt zurückgeben, und letzteres gibt den Inhalt der Rückgabeerklärung zurück. Betrachten Sie die folgende Funktion:
Funktion obj (Name) {this.name = name; Rückgabename;}Wenn wir den neuen Bediener verwenden, um anzurufen:
obj = neuer obj ("seear
Wenn wir direkt anrufen:
obj = obj ("suchTruth") // obj wird eine Zeichenfolge sein: "SeekTruth"
Es ist in der Tat ein sehr schwieriges Design. Wenn wir anrufen, müssen wir unterscheiden, ob wir neue verwenden müssen. Im Allgemeinen beginnen Funktionen, die das neue Keyword verwenden müssen, mit der Kapitalisierung.
Eine andere knifflige Sache ist, dass, wenn der zurückgegebene Rückgabewert ein Objekt ist:
Funktion obj (Name) {this.name = name; zurückkehren {};}Auf diese Weise werden wir unabhängig davon, ob wir den neuen Bediener anrufen oder nicht, den Wert in der Rückgabeerklärung zurückgeben:
NEUE OBJ ("SeekTruth") // => {} obj ("seeexTruth") // => {}Was zum Teufel ist es entworfen ...
Objektvererbung
Prototyp
Wie bereits erwähnt, gibt es in JavaScript keine Klasse. Wie implementiert JavaScript die Vererbung? Die Antwort erfolgt durch die Prototypkette. In JavaScript hat jedes Objekt einen Prototyp. Beim Erstellen eines Objekts ist der vom Objekt geerbte Prototyp, falls angegeben, Object.Prototyp. Das Funktionsobjekt vererbt die Funktion.Prototype (Funktion.Prototyperered Object.Prototype):
Object.Prototype // => {} function.prototype // => [Funktion]Wir können den Prototyp des Objekts durch die __Proto__ -Vertrautheit des Objekts anzeigen:
a = {} a .__ proto__ // => {}JavaScript implementiert die Vererbung durch Angabe des Prototyps des Objekts. Es gibt drei Hauptmethoden, um den Prototyp des Objekts anzugeben. Einer soll den Prototyp im Konstruktor angeben, im zweiten ist es, das __Proto__ -Attribut des Objekts direkt zu ändern, und die dritte besteht darin, die Funktion des Objekts zu verwenden. Schauen wir es uns wiederum an.
Geben Sie den Prototyp im Konstruktor an
Wir können den Prototyp des Objekts im Konstruktor angeben:
me = {"FirstName": "Seek", "LastName": "Truth", "GetName": function () {return this.firstname+this.lastName; // Dies entspricht einem Zeiger auf dieses Objekt}} Funktion obj (name) {this.firstname = name; das .__ proto__ = ich; // Geben Sie den Prototyp als ME -Objekt an} anNach Angabe des Prototyps können wir auf die Eigenschaften des Prototyps zugreifen, nachdem wir ein neues Objekt erstellt haben:
obj = neuer obj ("foo"); // => {FirstName: 'foo'} obj.firstname // => fooobj.lastname // => TruthObj.getname () // => "footruth"Wenn Sie auf ein Objekt zugreifen, versuchen Sie zunächst, die Eigenschaft im geänderten Objekt zu finden. Wenn nicht, kehren Sie zum Prototyp zurück, um bis zum Object.Prototyp zu suchen. Wenn wir die Eigenschaften (Methoden) im Prototyp in einem neuen Objekt neu schreiben, überschreiben die neu geschriebenen Eigenschaften (Methoden) die Definition im Prototyp, die in einer klassenbasierten Sprache ein wenig wie Funktion überlastet.
Beachten Sie, dass sich auch die Eigenschaft von LastName des OBJ -Objekts ändert, wenn sich die Eigenschaft von LastName des Prototyps ME -Objekts geändert hat, da das Objekt des OBJ nach Eigenschaften des Prototyps sucht, auch die Eigenschaft von LastName des OBJ -Objekts:
me.lastname = "me" obj.lastname // => "me" obj.getName () // => "foome"
Ändern Sie den Prototyp des Objekts direkt
Wir können auch den Prototyp des Objekts direkt angeben (ändern):
obj2 = {} obj2 .__ proto__ = meObj2.firstname // => seearsObj2.lastName // => "me" obj2.getName () // => "seeearme"Verwenden Sie die Funktion von Object.create
Obwohl die ersten beiden Methoden das Problem lösen können, sind diese beiden Schreibweisen nicht elegant, da JavaScript keine klassenbasierte Sprache ist und die erste Art des Schreibens leicht zu missverstehen ist. Crockford, der Autor der Essenz der JavaScript -Sprache, ist der Ansicht, dass Neue nicht in der JavaScript -Sprache erscheinen sollte, und es wird empfohlen, das Objekt zu verwenden. Erstellen Sie die Funktion, um Objekte basierend auf dem Prototyp zu erstellen. Die Verwendung des Objekts.Create -Funktion ist sehr einfach:
obj3 = Object.create (me) // Erstellen Sie ein neues Objekt mit mir als Prototyp obj3.firstname // => seearchObj3.lastname // => "me" obj3.getName () // => "Seekme"
obj3 = Object.create (me) entspricht obj2 = {}; obj2.Proto = me, aber ersterer ist eleganter und leichter zu verstehen geschrieben.
Zusammenfassen
Als Prototyp-basierte und funktionale Programmiersprache hat JavaScript viele Eleganz und Kraft im Design, aber gleichzeitig hat es viele Druss- und Fallstricke. JavaScript ist am meisten auch die Sprache, die am meisten missverstanden wird. Nachdem ich den Vererbungsmechanismus des Objekts von JavaScript gelernt hatte, habe ich das Gefühl, dass sich mein Level stark verbessert hat.
Die obige kurze Diskussion über JavaScript -Objekte und Vererbung ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.