Ich habe mich in letzter Zeit mit JavaScript-Frameworks wie Angular und Meteor beschäftigt und mich gefragt, woher sie wissen, wann sich eine Objekteigenschaft geändert hat, damit sie das DOM aktualisieren konnten.
Ich war ein wenig überrascht, dass Angular einfache alte JS-Objekte verwendet hat, anstatt dass Sie irgendeine Art von Getter / Setter aufrufen müssen, damit sie sich einklinken und die notwendigen Aktualisierungen vornehmen kann. Mein Verständnis ist, dass sie die Objekte nur regelmäßig nach Änderungen abfragen.
Aber mit dem Aufkommen der Getter und Setter in JS 1.8.5 Wir können es besser machen, können wir nicht?
Als kleinen Proof-of-Concept habe ich dieses Skript zusammengestellt:
( Bearbeiten: aktualisierter Code zum Hinzufügen der abhängigen Eigenschaft / Methodenunterstützung)
%Vor%Welche Protokolle:
Name geändert von "Ryan Gosling" zu "Ryan Reynolds"
Das einzige Problem, das ich sehe, ist das Definieren von Methoden wie fullName()
für das Objekt person, das von den anderen beiden Eigenschaften abhängt. Dies erfordert ein wenig zusätzliches Markup für das Objekt, damit Entwickler die Abhängigkeit angeben können.
Abgesehen davon, gibt es irgendwelche Nachteile für diesen Ansatz?
Aufkommen der Getter und Setter in JS 1.8.5 - Gibt es Nachteile bei diesem Ansatz?
O(1)
) Operation ist, während bei Getter / Setter viel mehr passiert. Sie müssen darauf achten, nicht zu vergessen, und die Verwendung von tatsächlichen Methoden könnte helfen. Wenn wir also wissen, was wir tun, können wir es besser machen.
Dennoch gibt es einen großen Punkt, an den wir uns erinnern müssen: die Synchronität / Asynchronität (siehe auch diese exzellente Antwort ). Angulars Dirty Checking ermöglicht es Ihnen, eine Reihe von Eigenschaften gleichzeitig zu ändern, bevor das Ereignis bei der nächsten Schleife der nächsten Schleife ausgelöst wird. Dies hilft, semantisch ungültige Zustände zu vermeiden (die Verbreitung von).
Aber ich sehe auch die synchronen Getter / Setter als eine Chance. Sie ermöglichen uns, die Abhängigkeiten zwischen Eigenschaften zu deklarieren und die gültigen Zustände dadurch zu definieren. Es wird automatisch die Korrektheit des Modells sicherstellen, während wir nur eine Eigenschaft gleichzeitig ändern müssen (anstatt firstName
und fullName
die ganze Zeit zu ändern, ist firstName
genug). Dennoch, während der Auflösung von Abhängigkeiten, die möglicherweise nicht wahr sind, müssen wir uns darum kümmern.
Daher sollten die Listener, die nicht mit der Verwaltung von Abhängigkeiten in Beziehung stehen, asynchron ausgelöst werden. Nur setImmediate
ihre Schleife.
Tags und Links javascript design-patterns observable