wie man Javascript Object.defineProperty benutzt
Schaute ich mich um, wie die - Objekt.defineProperty
Methode, aber konnte nicht finden, dass irgendetwas anständiges.
Jemand gab mir dieses code-snippet:
Object.defineProperty(player, "health", {
get: function () {
return 10 + ( player.level * 15 );
}
})
Aber ich verstehe es nicht. Vor allem, die get
ist, was ich nicht bekommen kann (Wortspiel beabsichtigt). Wie funktioniert es?
InformationsquelleAutor der Frage Math chiller | 2013-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da fragte man ein ähnliche Fragenehmen Sie es Schritt für Schritt. Es ist ein bisschen länger, aber es spart Ihnen unter Umständen viel mehr Zeit als ich verbracht habe, auf das schreiben dieses:
Eigenschaft ist ein OOP-feature konzipiert für die saubere Trennung von client-code. Zum Beispiel, in einigen e-shop, die Sie haben könnten Objekte wie diese:
Dann in Ihrem client-code (e-shop), die Sie hinzufügen können Rabatte auf Ihre Produkte:
Später, die e-shop-Betreiber erkennen können, dass der Rabatt kann nicht größer sein als, sagen wir 80%. Nun müssen Sie JEDES auftreten der Rabatt änderungen in den client-code und fügen Sie eine Zeile
Dann die e-shop-Betreiber kann weitere änderung seiner Strategie, wie ", wenn der Kunde Wiederverkäufer, der maximale Rabatt kann 90%". Und Sie müssen die änderung an mehreren stellen wieder plus, die Sie sich merken müssen, ändern Sie diese Zeilen, wenn die Strategie geändert wird. Dies ist ein schlechtes design. Das ist, warum Kapselung ist das Grundprinzip der OOP. Wenn der Konstruktor war so:
Dann können Sie einfach ändern Sie die
getDiscount
(accessor) undsetDiscount
(mutator) Methoden. Das problem ist, dass die meisten Mitglieder Verhalten sich wie gewöhnliche Variablen, nur den Rabatt braucht Besondere Pflege hier. Aber gutes design erfordert der Verguss von jedem Mitglied zu halten, den code erweiterbar. So müssen Sie viel code, der nichts tut. Dies ist auch ein schlechtes design, eine boilerplate antipattern. Manchmal kann man nicht nur die Umgestaltung der Felder, um die Methoden später (die eshop-code kann sehr groß werden oder einige third-party-code, hängt möglicherweise von der alten version), so dass die boilerplate ist das kleinere übel hier. Aber noch ist es böse. Das ist, warum Eigenschaften wurden in viele Sprachen. Sie könnten behalten Sie den ursprünglichen code, nur verwandeln die Rabatt-Mitglied in einem Eigentum mitget
undset
Blöcke:Hinweis der vorletzten Zeile: die Verantwortung für die richtige Rabatt-Wert verschoben wurde aus dem client-code (e-shop-definition) für die definition des Produkts. Das Produkt ist dafür verantwortlich, dass seine Mitglieder-Daten konsistent. Gutes design ist (grob gesagt), wenn der code funktioniert auf die gleiche Weise wie unsere Gedanken.
So viel über Eigenschaften. Aber javascript unterscheidet sich von der reinen Objekt-orientierten Sprachen wie C# und codes die Funktionen anders:
In C#transformieren die Felder in Eigenschaften ist ein brechen ändernalso öffentlichen Feldern soll codiert werden, wie Automatisch Implementierte Eigenschaften wenn der code könnte verwendet werden, in zahlen zusammengestellt client.
In Javascriptdie standard-Eigenschaften (Daten Mitglied mit getter-und setter-oben beschrieben) sind definiert durch accessor-Deskriptor (in dem link, den Sie in Ihrer Frage). Ausschließlich verwenden, können Sie Datenbeschreibung (so dass Sie nicht verwenden können, d.h. Wert und set auf dem gleichen Grundstück):
Beide Deskriptoren können die folgenden Mitglieder:
for(var i in theObject)
; wenn false, wird es nicht Durchlaufen werden, aber es ist immer noch zugänglich als public* es sei denn, in strict-Modus - in diesem Fall JS-hält die Ausführung mit TypeError, es sei denn, es ist gefangen in try-catch-block
Lesen Sie diese Einstellungen verwenden
Object.getOwnPropertyDescriptor()
.Lernen durch Beispiel:
Wenn Sie nicht möchten, dass der client-code solche cheats, Schränken Sie das Objekt, indem Sie drei Ebenen der Entbindung:
Object.isExtensible(<yourObject>)
um zu überprüfen, ob die Methode, die verwendet wurde, auf das Objekt. Die Prävention ist flachen (Lesen Sie unten).configurable: false
auf alle Eigenschaften). VerwendenObject.isSealed(<yourObject>)
zu erkennen, diese Funktion auf das Objekt. Die Dichtung ist flachen (Lesen Sie unten).writable: false
alle Eigenschaften mit Daten-Deskriptor). Setter beschreibbare Eigenschaft ist nicht betroffen (da es keine hat). Der freeze ist flachen: es bedeutet, dass, wenn die Eigenschaft ist ein Objekt, dessen Eigenschaften SIND NICHT gefroren (wenn Sie möchten, sollten Sie etwas wie "deep freeze", ähnlich deep-copy - cloning). VerwendenObject.isFrozen(<yourObject>)
es zu erkennen.Brauchen Sie nicht diese Mühe machen, wenn Sie schreiben, nur ein paar Zeilen Spaß. Aber wenn Sie wollen, um code zu einem Spiel (wie du schon erwähnt hast in der verlinkten Frage), sollten Sie kümmern sich auch wirklich um gutes design. Versuche über google etwas über antipatterns und code smell. Es wird Ihnen helfen, Situationen zu vermeiden, wie "Oh, muss ich komplett neu schreiben, meinen code wieder!"es kann sparen Sie Monate der Verzweiflung, wenn Sie wollen, um code zu viel. Viel Glück.
InformationsquelleAutor der Antwort Jan Turoň
defineProperty ist eine Methode auf dem Objekt, mit denen Sie zum konfigurieren der Eigenschaften erfüllen einige Kriterien.
Hier ist ein einfaches Beispiel, ein Mitarbeiter-Objekt mit zwei Eigenschaften firstName & lastName, und fügen Sie die zwei Eigenschaften, durch überschreiben der toString - Methode auf das Objekt.
Erhalten Sie als Ausgabe : Jameel Moideen
Ändere ich den gleichen code mit defineProperty auf das Objekt
Der erste parameter ist der name des Objekts und der zweite parameter ist der name der Eigenschaft, die wir hinzufügen , in unserem Fall ist es die toString und dann wird der Letzte parameter im json-Objekt, die einen Wert gehen, um eine Funktion und drei Parameter beschreibbar,die enumerable-und konfigurierbar.Jetzt habe ich gerade erklärt alles, was als wahr.
Wenn u das Beispiel ausführen, erhalten Sie Ausgabe als : Jameel Moideen
Lasst uns verstehen, warum brauchen wir die drei Eigenschaften wie beschreibbar,enumerable und konfigurierbar.
beschreibbar
Einer der sehr ärgerlich ist Teil der javascript ist , wenn Sie ändern Sie die toString-Eigenschaft auf etwas anderes, zum Beispiel
wenn Sie diese wieder , wird alles bricht
Wir ändern beschreibbar zu false. Wenn die gleiche wieder erhalten Sie die korrekte Ausgabe als "Jameel Moideen' . Diese Eigenschaft wird verhindert, überschreiben Sie diese Eigenschaft später.
enumerable
wenn Sie drucken, werden alle Schlüssel innerhalb des Objekts , können Sie sehen, alle Eigenschaften, einschließlich toString.
wenn Sie enumerable auf false , können Sie ausblenden toString Eigenschaft von allen anderen. Wenn führen Sie diesen wieder erhalten Sie Vorname,Nachname
konfigurierbare
wenn jemand später neu definiert das Objekt, auf die Sie später zum Beispiel enumerable auf true und führen Sie es. Sie können sehen, toString Eigentum kam wieder.
eingeschränkt werden kann dieses Verhalten durch das setzen konfigurierbar auf false.
Orginal Verweis auf diese Informationen aus meinem persönlichen Blog
InformationsquelleAutor der Antwort JEMI
Grundsätzlich
defineProperty
ist eine Methode, die in der 3-Parameter - Objekt, eine Eigenschaft und einen Deskriptor. Was ist passiert in diesem Aufruf ist die"health"
Eigenschaft desplayer
Objekt wird immer zugewiesen, um 10 und 15 mal das Spieler-Objekt-Ebene.InformationsquelleAutor der Antwort Cole Pilegard
ja keine Funktion mehr Erweiterung für setup-setter - & get
dies ist mein Beispiel Objekt.defineProperty(obj,name,func)
InformationsquelleAutor der Antwort Faizal Pribadi
Objekt.defineProperty() ist eine Globale Funktion..es ist nicht verfügbar in der Funktion, die erklärt, das Objekt anderweitig.Du wirst es statisch...
InformationsquelleAutor der Antwort ISONecroMAn