Dieser Artikel vermittelt Ihnen relevantes Wissen über JavaScript und stellt hauptsächlich verwandte Themen zur Objektorientierung vor, einschließlich Attributdeskriptoren, Datendeskriptoren, Zugriffsdeskriptoren usw. Ich hoffe, es ist für alle hilfreich.
[Verwandte Empfehlungen: Javascript-Video-Tutorial, Web-Frontend]
JavaScript unterstützt tatsächlich eine Vielzahl von Programmierparadigmen, einschließlich funktionaler Programmierung und objektorientierter Programmierung:
Objekte in JavaScript sind als ungeordnete Sammlung von Attributen konzipiert, ähnlich einer Hip-Hop-Tabelle, bestehend aus Schlüsseln und Werten;
Der Schlüssel ist ein Bezeichnername, und der Wert kann von einem beliebigen Typ oder einem anderen Objekt- oder Funktionstyp sein;
Wenn der Wert eine Funktion ist, können wir ihn eine Methode des Objekts nennen;
Die gängigste Methode zum Erstellen von Objekten bestand in der Anfangszeit darin, die Object-Klasse zu verwenden und das Schlüsselwort new zum Erstellen eines Objekts zu verwenden und dann die Eigenschaften oder Methoden im Objekt zu speichern:
var obj = neues Objekt() obj.name = 'warum' console.log(obj.name, obj) // warum { name: 'why' }
Später erstellten viele Entwickler der Einfachheit halber Objekte direkt in Form von Literalen:
//Literale Methode var obj2 = { name: 'jam', age: '8' } console.log(obj) // { Name: 'jam', Alter: '8' }
Bisher wurden unsere Eigenschaften direkt im Objekt definiert oder dem Objekt direkt hinzugefügt.
Auf diese Weise können wir diesem Attribut jedoch keine Einschränkungen auferlegen: Kann dieses Attribut beispielsweise durch delect
gelöscht werden und kann es während for-in
-Durchquerung durchlaufen werden?
Wenn wir eine genauere operative Kontrolle über ein Attribut haben möchten, kann ich Attributdeskriptoren verwenden. Die Eigenschaften eines Objekts können durch Eigenschaftsdeskriptoren genau hinzugefügt oder geändert werden.
Eigenschaftsdeskriptoren müssen Object.defineProperty
verwenden, um Eigenschaften hinzuzufügen oder zu ändern.
属性描述符分为两种:数据描述符和存取描述符
Ein Datendeskriptor ist eine Eigenschaft mit einem Wert, der möglicherweise schreibbar ist oder nicht. Der Datendeskriptor verfügt über die folgenden optionalen Schlüsselwerte:
Wert: Der Wert, der diesem Attribut entspricht. Kann jeder gültige JavaScript-Wert sein (numerischer Wert, Objekt, Funktion usw.). Der Standardwert ist undefiniert.
beschreibbar: Nur wenn die Beschreibbarkeit dieses Attributs wahr ist, kann der Wert durch den Kopieroperator geändert werden. Der Standardwert ist falsch.
konfigurierbar: Nur wenn das Konfigurierbare des Attributs wahr ist, kann der Attributdeskriptor geändert werden und das Attribut kann auch aus dem entsprechenden Objekt gelöscht werden. Der Standardwert ist falsch.
enumerable: Nur wenn die Enumerable der Eigenschaft wahr ist, kann die Eigenschaft in der Enumerationseigenschaft des Objekts erscheinen. Der Standardwert ist falsch.
Die Methode Object.getOwnPropertyDescriptor() gibt den Eigenschaftsdeskriptor zurück, der einer eigenen Eigenschaft für das angegebene Objekt entspricht.
Object.getOwnPropertyDescriptor(obj, prop)
obj: das zu findende Zielobjekt
prop: Attributname im Zielobjekt (String-Typ).
Rückgabewert: Wenn die angegebene Eigenschaft für das Objekt vorhanden ist, wird ihr Eigenschaftsdeskriptorobjekt zurückgegeben, andernfalls wird undefiniert zurückgegeben.
Hinweis: Wenn der erste Parameter dieser Methode kein Objekt ist, wird ein Fehler (TypeError) gemeldet.
Die Methode Object.defineProperty() definiert direkt eine neue Eigenschaft eines Objekts oder ändert eine vorhandene Eigenschaft eines Objekts und gibt das Objekt zurück.
Object.defineProperty(obj, prop, descriptor)
obj: Das Objekt, für das die Eigenschaften definiert werden sollen.
prop: Der Name der Eigenschaft, die definiert oder geändert werden soll.
Deskriptor: der zu definierende oder zu ändernde Attributdeskriptor
Rückgabewert: das an die Funktion übergebene Objekt
Der folgende Beispielcode zeigt das Festlegen und Abrufen von Attributdeskriptoren var obj = { Name: 'Marmelade', Alter: 8 } Object.defineProperty(obj, 'job', { Wert: 'Anwalt' }) console.log(Object.getOwnPropertyDescriptor(obj, 'age')) // { Wert: 8, beschreibbar: wahr, aufzählbar: wahr, konfigurierbar: wahr } console.log(obj.job) // Anwalt // Neue Eigenschaft durch defineProperty, diese neue Eigenschaft ist nicht änderbar, nicht löschbar und nicht aufzählbar console.log(Object.getOwnPropertyDescriptor(obj, 'job')) / / {Wert: 'Anwalt', beschreibbar: falsch, aufzählbar: falsch, konfigurierbar: falsch}
注意:通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的
var obj = { Name: 'Marmelade', Alter: 8 } Object.defineProperty(obj, 'address', { Wert: 'Hebei', // konfigurierbar Diese Eigenschaft kann nicht gelöscht werden, und Sie können defineProperty auch nicht verwenden, um den Eigenschaftsdeskriptor erneut zu ändern. konfigurierbar: false, }) delete obj.address // Ich möchte delete verwenden, um dieses Attribut zu löschen. obj.address = 'Guangzhou' // Ich möchte den Attributadressenwert in obj in Guangzhou ändern. console.log(obj.address) // Ausgabeergebnis: Hebei
Da der konfigurierbare Wert des Attributdeskriptors falsch ist und nicht gelöscht oder geändert werden kann, werden Löschung und Änderung nicht wirksam.
var obj = { Name: 'Marmelade', Alter: 8}Object.defineProperty(obj, 'sex', { Wert: 'Männlich', // enumerable konfiguriert, ob diese Eigenschaft aufgezählt werden kann enumerable: true})for (i in obj) { console.log(i)}
Bei enumerable: false ist das Ausgabeergebnis das Namensalter
Wenn aufzählbar: wahr, ist das Ausgabeergebnis Name, Alter, Geschlecht
var obj = { Name: 'Marmelade', Alter: 8}Object.defineProperty(obj, 'score', { Wert: 80, // beschreibbar: wahr beschreibbar: false})obj.score = 100 console.log(obj.score) // 80
Da der Wert von writeable falsch ist, ist die Änderung nicht erfolgreich und die endgültige Ausgabe beträgt 80, wenn die Punktzahl auf 100 geändert wird.
Halten Sie es für umständlich, den Eigenschaftsdeskriptor jeweils nur für eine Eigenschaft festzulegen? Object.defineProperties kann Ihnen bei der Lösung des Problems helfen.
Die Methode Object.defineProperties() definiert eine oder mehrere neue Eigenschaften oder ändert vorhandene Eigenschaften für ein Objekt und gibt das Objekt zurück.
Object.defineProperties(obj, props)
obj: Das Objekt, für das die Eigenschaften definiert werden sollen.
Requisiten: Das Objekt, dessen aufzählbare Eigenschaften oder geänderte Eigenschaftsdeskriptoren definiert werden sollen.
Rückgabewert: Das an die Funktion übergebene Objekt.
Der Beispielcode lautet wie folgt:
var obj = { name: 'jam',}Object.defineProperties(obj, { 'Alter': { Wert: 28, beschreibbar: wahr, konfigurierbar: falsch, aufzählbar: wahr }, 'Arbeit': { Wert: 'Anwalt', beschreibbar: wahr, konfigurierbar: falsch, aufzählbar: wahr }, 'Geschlecht': { Wert: 'Männlich', beschreibbar: falsch, konfigurierbar: falsch, aufzählbar: wahr }, 'Höhe': { Wert: '1,8 m', beschreibbar: falsch, konfigurierbar: falsch, aufzählbar: wahr }})console.log(obj) // Name: 'jam', Alter: 28, Job: 'Anwalt', Geschlecht: 'männlich', Größe: '1,8 m' }
Zugriffsdeskriptoren sind Eigenschaften, die durch Getter-Setter-Funktionspaare beschrieben werden. Der Zugriffsdeskriptor verfügt über die folgenden optionalen Schlüsselwerte:
get: Stellt eine Getter-Methode für die Eigenschaft bereit. Wenn kein Getter vorhanden ist, ist sie undefiniert. Wenn auf diese Eigenschaft zugegriffen wird, wird die Methode ausgeführt. Bei der Ausführung der Methode werden keine Parameter übergeben, aber das Objekt wird übergeben.
set: Stellt eine Setter-Methode für die Eigenschaft bereit. Wenn kein Setter vorhanden ist, ist sie undefiniert. Diese Methode wird ausgelöst, wenn der Eigenschaftswert geändert wird. Diese Methode akzeptiert den einzigen Parameter, nämlich den neuen Parameterwert der Eigenschaft.
konfigurierbar: Nur wenn das Konfigurierbare des Attributs wahr ist, kann der Attributdeskriptor geändert werden und das Attribut kann auch aus dem entsprechenden Objekt gelöscht werden. Der Standardwert ist falsch.
Enumerable: Nur wenn das Enumerable des Attributs wahr ist, kann das Attribut im Enumerationsattribut des Objekts erscheinen. Der Standardwert ist falsch.
Die Verwendung von configurable und enurnerable stimmt mit der in Datendeskriptoren überein, daher werde ich sie hier nicht im Detail erklären.
Sprechen Sie hauptsächlich über die Verwendung von Get- und Set-Methoden
var obj = { Name: 'Marmelade', Alter: 8, _Adresse: 'Hebei' } // Verwendungsszenarien von Zugriffsdeskriptoren // 1. Verstecken Sie ein bestimmtes privates Attribut, von dem erwartet wird, dass es direkt von der Außenwelt verwendet und zugewiesen wird // 2. Wenn wir den Prozess des Zugriffs und Festlegens des Werts eines bestimmten Attributs verstehen möchten , wir werden es auch verwenden Speichereigenschaftsdeskriptor Object.defineProperty(obj, 'address', { aufzählbar: wahr, konfigurierbar: wahr, get: function () { foo() gib diese_Adresse zurück }, set: Funktion (Wert) { Bar() this._address = Wert } }) Funktion foo () { console.log("Der Wert der Adresse wurde einmal abgefangen") } Funktionsleiste () { console.log("Der Wert der Adresse wird einmal festgelegt") }
Die obige Beispielcodekonsole gibt die folgenden Ergebnisse aus: