1. Knowledge Reserve:
1. Funktionen, die Attributnamen aufzählen:
(1) Für ... in: Sie können alle aufzählbaren Eigenschaften im Objekt (einschließlich eigener Eigenschaften und ererbten Eigenschaften) im Schleifenkörper durchqueren.
(2) Object.Keys (): Gibt ein Array zurück (aufzählbare Attribute)
(3) Object.getownPropertynames (): Alle eigenen Eigenschaften
3. Eigenschaften von Attributen: Datenattribute und Accessor -Attribute
(1) Datenattribute: Aufzählbarer konfigurierbarer Wert
Das Datenattribut hat nur einen einfachen Wert;
(2) Zubehörattribute: Schreiben (Set), Lesen (GET), Aufzählbar, konfigurierbar
Zubehör ist nicht beschreibbar (d. H. Es gibt kein beschreibbares Merkmal).
Wenn das Attribut eine festgelegte Methode hat, ist dieses Attribut beschreibbar und es gibt eine GET -Methode, dieses Attribut ist lesbar.
4. Methoden zur Definition von Attributeigenschaften: Object.DefineProperty (Objekt, Attribut, Deskriptorobjekt)
5. das Deskriptorobjekt der Eigenschaft erhalten: Object.getownPropertyDescriptor (Objekt, Eigenschaft)
2. Beispiel
1. Nach der Verwendung von für ... in können wir eine Methode zum Simulieren "Vererbung" schreiben:
<script type = "text/javaScript"> var mind = {}; var mutter = {name: "zhangzhiying", lastage: 21, sex: "weiblich"}; Funktion erweitert (Ziel, Quelle) {für (var p in Quelle) {Ziel [p] = source [p]; } return target; } erweitern (Kind, Mutter); console.log (Kind); // <strong> Objekt {Name: "Zhangzhiying", Lastage: 21, Sex: "weiblich"} </strong> </script>2. Verwenden Sie die Eigenschaften des Prototypobjekts, um in die Eigenschaften des Prototyps zu schleifen, und weisen Sie unseren leeren Objekten nacheinander Werte zu, wodurch die "Vererbung" realisiert wird. Diese Idee ist sehr korrekt. Ändern wir das obige Beispiel:
<script type = "text/javaScript"> var mind = {}; var Mutter = {Name: "Zhangzhiying", Lastage: 21, <strong> Alter (Wert) {this.lastage = value; }, ay () {return this.lastage+1; }, </Strong> Sex: "weiblich"}; <br> <strong> Mutter.age = 15; </strong> // Es gibt eine festgelegte Methode, die eine beschreibbare Funktion erweitert (Ziel, Quelle) {für (var p in Quelle) {Ziel [p] = Quelle [p]; } return target; } erweitern (Kind, Mutter); console.log (Kind); // <strong> Objekt {Name: "Zhangzhiying", Lastage: 15, Alter: 16, Sex: "weiblich"} </strong> </script>Sie können sehen, dass ein Paar Sets im Code verwendet wird, erhalten Sie. Wo Alter ein Accessor -Attribut ist.
Das Ergebnis des Laufs: Ein normales Objekt, das nicht eingestellt ist, erhalten Sie.
Schlussfolgerung: Die "Vererbung", die von in IN implementiert ist, leitet SET und GET nicht um. Es wandelt das Accessor -Attribut (Alter) in ein statisches Datenattribut um.
3. Setzen Sie Datenattribute für das Mutterobjekt
<script type = "text/javaScript"> var mind = {}; var Mutter = {Name: "Zhangzhiying", LastAt: 21, Setzen Sie das Alter (Wert) {this.lastage = value; }, ay () {return this.lastage+1; }, Sex: "weiblich"}; Object.DefineProperty (Mutter, "LastAt", {beschreibbar: false}); // Lastage auf nicht beschreibbare Mutter festlegen.age = 15; // Ungültig einstellen, da der Wert von Lasting unverändert bleibt, bleibt Lastage+1 unverändert, dh das Alter bleibt unverändert (Ziel, Quelle) {für (var p in Quelle) {Ziel [p] = Quelle [P]; } return target; } erweitern (Kind, Mutter); console.log (Kind); // Objekt {Name: "Zhangzhiying", Lastage: 21, Alter: 22, Sex: "weiblich"} child.lastage = 12; // Das Ergebnis zeigt, dass sich das letzte Mal ändert und angibt, dass das Kind. Lastage das Merkmal von Mother.lastage nicht "erben". Verwenden wir GetownPropertyDesriptor () -Methode, um <br> console.log (Object.geto) zu bestätigen<Em id = __ mcedel> </script> </em>
Schlussfolgerung: Um die Vererbung zu erreichen, müssen wir das Problem noch lösen -> "Vererbungsmerkmale" -attributmerkmale.
4. Komplette Version
<script type = "text/javaScript"> var mind = {}; var Mutter = {Name: "Zhangzhiying", LastAt: 21, Setzen Sie das Alter (Wert) {this.lastage = value; }, ay () {return this.lastage+1; }, Sex: "weiblich"}; Object.DefineProperty (Mutter, "LastAt", {beschreibbar: false}); Mutter.age = 15; <Span style = "color: #333399"> <strong> Funktion erweitert (Ziel, Quelle) {var names = Object.getownPropertynames (Quelle); // alle Eigenschaftsnamen für (var i = 0; i <names.length; i ++) {if (Namen [i] in target) fortsetzen; // Wenn diese Eigenschaft vorhanden ist, überspringen Sie (im Prototyp -Vererbung, wenn das Attribut der eigenen Eigenschaft und die Eigenschaft des Objekts dupliziert werden, die eigene Eigenschaft beibehalten) var desc = Object.getownPropertyDescriptor (Quelle, Namen [i]); // Erhalten Sie das Deskriptorobjekt des Mutterattributs (dh die Menge der Attributmerkmale, die durch das Deskriptorobjekt in ES5) Objekt dargestellt wird. DefineProperty (Ziel, Namen [i], Desc); // das Deskriptorobjekt der Mutter in die Attributdefinition des Kindes} zurückgeben} Return Target; } </Strong> </span> erweitern (Kind, Mutter); console.log (Kind); Kind.Lastage = 12; console.log (Object.getownPropertyDescriptor (Kind, "LastAbage")); console.log (Kind); </script>Endergebnisse:
Sie können den Druck des Drucks dreimal deutlich sehen, das Kind "erbte", um festzulegen und zu bekommen, der Lastage -Wert hat sich nicht geändert, und beschreibbar ist ebenfalls falsch.
Zusammenfassung: Ich lese kürzlich den "Autoritativen Leitfaden zu JavaScript". Ich werde einige Erfahrungen zusammenfassen. Wenn es Fehler gibt, korrigieren Sie mich bitte und lernen Sie zusammen und machen Sie gemeinsam Fortschritte ~
Die obige detaillierte Erläuterung der Vererbung von JavaScript unter Verwendung von Funktionen ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.