Attributdeskriptor ist ein neues Konzept, das in ES5 hinzugefügt wurde, und seine Funktion besteht darin, den Eigenschaften des Objekts mehr Kontrolle hinzuzufügen.
Object.DefineProperty
Um Attributdeskriptoren zu untersuchen, müssen wir zunächst über das Object.DefineProperty -Methode sprechen. Ziel dieser Methode ist es, neue Eigenschaften für das Objekt zu definieren oder vorhandene Eigenschaften zu ändern. Der Prototyp ist wie folgt:
Die Codekopie lautet wie folgt:
Object.DefineProperty (OBJ, Prop, Deskriptor)
Beispiel der Nutzung:
Die Codekopie lautet wie folgt:
var obj = {};
Object.DefineProperty (obj, 'attr', {value: 1});
Der obige Code fügt dem OBJ -Objekt ein Attribut mit dem Namen Attr hinzu, mit einem Wert von 1. entspricht:
Die Codekopie lautet wie folgt:
var obj = {};
obj.attr = 1;
Im Vergleich dazu scheint das Schreiben von Object.defineProperty komplizierter zu sein. Das größte Geheimnis liegt jedoch in seinem dritten Parameter.
Datendeskriptor
Unter der Annahme, dass wir ein schreibgeschütztes Attribut haben möchten, können wir den beschreibbaren Datenbekriptor hinzufügen:
Die Codekopie lautet wie folgt:
var obj = {};
Object.DefineProperty (obj, 'attr', {
Wert: 1,
Beschreibbar: Falsch
});
console.log (obj.attr);
obj.attr = 2; // scheitern
console.log (obj.attr);
Führen Sie das obige Programm aus und Sie werden feststellen, dass der Wert des zweimal gedruckten Wertes 1 ist, was bedeutet, dass das Schreiben des Attributs fehlgeschlagen ist. Dieses Ergebnis ist jedoch etwas unerklärlich, da die Ausführung der Zuweisungsanweisung keine Ausnahmen enthält, es jedoch fehlschlägt. Stellen Sie sich vor, wenn ein solches Problem im Blockbuster -Code auftritt, wird es schwierig sein, es zu beheben. Solange der Code im strengen Modus ausgeführt wird, wird eine Ausnahme generiert:
Die Codekopie lautet wie folgt:
"Strikte"; // Strict -Modus eingeben
var obj = {};
Object.DefineProperty (obj, 'attr', {
Wert: 1,
Beschreibbar: Falsch
});
obj.attr = 2; // Ausnahme machen
Schauen wir uns einen anderen Datendeskriptor auf, der steuern kann, ob das Attribut aufgezählt werden kann. Wenn Sie einfach eine Eigenschaft definieren, kann diese Eigenschaft in der für ... in Schleife aufgezählt werden:
Die Codekopie lautet wie folgt:
var obj = {};
obj.attr = 1;
für (var i in obj) {console.log (obj [i]); }
Aufzählbar kann es "verstecken":
var obj = {};
Object.DefineProperty (obj, 'attr', {
Wert: 1,
Aufzählbar: Falsch
});
für (var i in obj) {console.log (obj [i]); }
Führen Sie den oben genannten Code aus und Sie werden feststellen, dass die Konsole nichts ausgibt, da das ATT -Attribut zu diesem Zeitpunkt nicht aufgezählt werden kann.
Sie können jedoch eine Frage haben: Kann der Attributdeskriptor geändert werden? Kann beispielsweise eine schreibgeschützte Eigenschaft wieder als beschreibbar definiert werden? Tatsächlich hängt dies von einem anderen konfigurierbaren Datendeskriptor ab, der steuern kann, ob der Attributdeskriptor geändert werden kann.
Die Codekopie lautet wie folgt:
var obj = {};
Object.DefineProperty (obj, 'attr', {
Wert: 1,
Beschreibbar: Falsch,
Konfigurierbar: True
});
Object.DefineProperty (obj, 'attr', {
Beschreibbar: wahr
});
obj.attr = 2;
Der obige Code definiert zuerst ATT als schreibgeschütztes Attribut und definiert es dann als beschreibbar neu. Das Schreiben von Attr ist also erfolgreich.
Zugangsdeskriptor
Der Zugriffsdeskriptor ähnelt dem Get/Set-Accessor in objektorientiertem.
Die Codekopie lautet wie folgt:
var obj = {};
Object.DefineProperty (obj, 'attr', {
set: function (val) {this._attr = math.max (0, val); },
get: function () {return this._attr; }
});
obj.attr = -1;
console.log (obj.attr); // 0
Im obigen Code wird der Zugriff auf ATT zu Zugriff auf _ATTR und der Mindestwert ist in der festgelegten Funktion auf 0 begrenzt.
Attributdeskriptor abrufen
Die oben genannten sind alle ein Setzen von Attributdeskriptoren einstellen. Wie erhalten Sie also die festgelegten Deskriptoren? Object.GetownPropertyDescriptor kann dies tun.
Die Codekopie lautet wie folgt:
var obj = {};
Object.DefineProperty (obj, 'attr', {
Wert: 1,
Beschreibbar: Falsch,
Konfigurierbar: True
});
var wasc = Object.getownPropertyDescriptor (obj, 'attr');
console.dir (desc);
Objektkontrolle
Das zuvor erwähnte Object.DefineProperty arbeitet auf den Eigenschaften des Objekts, während die drei nachstehend genannten Methoden direkt auf dem Objekt arbeiten.
Object.Preventextensionen können verhindern, dass Objekte neue Eigenschaften haben:
Die Codekopie lautet wie folgt:
var obj = {};
obj.attr = 1;
Object.Preventextensions (OBJ);
obj.attr2 = 2; //scheitern
Object.Seal kann die Objekt-Eigenschaftswerte nur für geändert machen lassen (wenn die Eigenschaft schreibgeschützt ist, können sogar die Eigenschaftswerte nicht geändert werden):
Die Codekopie lautet wie folgt:
var obj = {};
obj.attr = 1;
Object.Seal (obj);
obj.attr = 1,5;
obj.attr löschen; // scheitern
Object.Freeze kann Objekte vollständig unmodifiziert machen:
Die Codekopie lautet wie folgt:
var obj = {};
obj.attr = 1;
Object.Freeze (obj);
obj.attr = 1,5; // scheitern
obj.attr2 = 2; //scheitern
Dann fragen Sie sich vielleicht noch einmal, woher Sie wissen, ob ein Objekt verhindern, dass ein Objekt verhindern wurde, eingelegt oder einfrieren? Die Antwort lautet, Object.isextesible, Object.isaled bzw. Object.isFrozen aufzurufen. Die Verwendung dieser drei Funktionen ist relativ einfach und nicht mehr umständlich.
Im Allgemeinen kann das Objekt durch Attributdeskriptoren weiter strikt kontrolliert werden und die strenge Programmlogik wird gestärkt. Der einzige Nachteil ist, dass ES5 in IE9 im Grunde genommen implementiert wird (IE9 unterstützt noch keinen strengen Modus). In Anbetracht der Tatsache, dass der inländische IE8 -Anteil noch relativ hoch ist, können diese Dinge nur in mobilen Browsern und Node.js. verwendet werden.