Mixins Umsetzung in JavaScriptProblem Sie wollen Ruby-Implementierung in JavaScript Stil Mixins leicht Objekt Funktionalität zu erweitern. Theory In Ruby Mixins sind ein Mittel zur Erweiterung der Funktionalität eines Objekts, indem sie die Funktionalität eines anderen Objekts. Wenn Sie eine Instanz von einem JavaScript-Typ, die Methoden und Eigenschaften mit dem Typ zugeordnet, hängt von der Erklärung des Typs. Um die Funktionalität einer Instanz zu erweitern, ist ein Objekt mit einer Funktion oder einem anderen Objekt zugewiesen. Quelle: / website / ROOT / Ajax / Javascript / mixins.html Funktion DefinedClass () () DefinedClass.prototype.defined1 = function () () DefinedClass.prototype.defined2 = function () ()
Die DefinedClass Funktion wird verwendet, um eine Art zu definieren. Zwei Methoden, defined1 und defined2, sind mit dem DefinedClass Typ zugeordnet. Jede Methode ist mit dem Prototyp Eigenschaft zugeordnet, so daß jedes Mal DefinedClass instanziiert wird, werden diese Methoden auf die gleiche Funktion beispielsweise Aktien. Wenn Sie also eine Eigenschaft des defined1 oder defined2 zuordnen, dann werden alle Instanzen von DefinedClass in der Lage, die gleiche Eigenschaft beispielsweise Aktien. Solution Um eine Instanz von DefinedClass zu verlängern, können Sie individuell ordnen Sie die Eigenschaften der Instanz. Individuell Kopieren einer Eigenschaft ist langweilig, eine effizientere Lösung ist, die Eigenschaften eines Objekts auf ein anderes Objekt zu kopieren. Viele Rahmen, wie Prototype und Dojo Toolkit, bieten die Möglichkeit, Objekte zu kopieren. Im Folgenden ist der Prototyp für Mixin Umsetzung. Quelle: / website / ROOT / Prototyp / dist / prototype.js Object.extend = function (Ziel, Quelle) (for (property in source) (Ziel [property] = source [property];) return Bestimmungsort; Die Object.extend Funktion hat zwei Parameter: Ziel und Quelle. Die Ziel-Parameter repräsentiert ein Objekt, die Eigenschaften hinzugefügt werden. Die Quelle Parameter stellt ein Objekt, das sind seine Eigenschaften kopiert werden. Die Eigenschaften werden kopiert mit einer for-Schleife, weil es nicht möglich, die Eigenschaften eines Objekts beispielsweise in sonstiger Weise zu durchlaufen. Das Anwesen Kennung, nicht der Wert der Eigenschaft, wird iteriert. Um die Eigenschaft Wert zu ermitteln, können Sie die folgende Syntax: source.property Das Problem mit dieser Notation ist, dass die Eigenschaft explizit definiert ist, und dessen Verwendung im Zusammenhang mit der Durchführung einer Mixin Funktion ist kompliziert. Die Lösung wird auf der JavaScript-Array-Schreibweise verwenden und die Eigenschaft abzurufen als Array. Gehen wir zurück zum Prototyp-Lösung, wie jede Eigenschaft der Quelle iteriert wird, wird der Wert abgerufen und an das Ziel zugeordnet. Let's gelten die Verlängerung Methode unter Verwendung des folgenden Objektinstanz Erklärung an. Quelle: / website / ROOT / Ajax / Javascript / mixins.html MyExtensions = (test: function (tstValue) (assertEquals (tstValue, MyExtensions.test.value);)) Die MyExtensions Deklaration der Klasse ist eine statische Bezug auf ein einziges Objekt eingebettet, das eine Instanz vom Typ Object ist. Wir wollen, um die Eigenschaft auf eine Instanz von DefinedClass kopieren, wie in dem folgenden Test ergeben hat. Quelle: / website / ROOT / Ajax / Javascript / mixins.html prototype_mixin: function () (var cls = new DefinedClass (); if (MyExtensions.test.value) (testManager.failed ();) Object.extend (cls, MyExtensions ); cls.test.value = 3; cls.test (3); cls.test.value = 10; cls.test (10);) Der Test-Code geht über den einfachen Aufruf von Object.extend, sondern zeigt, dass die meisten Toolkits Mixins mit Ente Typen auf der Grundlage von Referenzen zu implementieren. Es ist nicht falsch, sondern weil Funktionen sind Objekte, sie werden von mehreren Typen Klasse geteilt werden. Um dies zu verstehen, schauen Sie sich die Umsetzung der MyExtensions.test. Die Umsetzung bezieht sich auf die Funktion test.value Eigentum und Querverweise mit der tstValue Parameter. Bei der Durchführung der prototype_mixin Funktion, eine Instanz von DefinedClass erstellt wird und anschließend mit den Methoden der MyExtensions verlängert. Die cls.test.value Eigenschaft zugeordnet ist ein Wert von 3, und der Test-Methode aufgerufen wird. Die Umsetzung der Test überprüft den Wert der MyExtensions.test.value als 3. Wenn der Test Methode der cls waren eine Kopie der MyExtension.test Methode, dann ist der Test wird fehlschlagen, weil MyExtensions.test.value noch nicht zugeordnet wurde, wie von der IF-Test-Block belegt. Aber der Test-Code nicht scheitern, dass die cls.test und MyExtensions.test sind ein und dieselbe Methode. Referenced-basierte Duck Typing gibt einige seltsame Verhaltensweisen, von denen eine im folgenden Code dargestellt. Quelle: / website / ROOT / Ajax / Javascript / mixins.html Funktion GetExtensionFunctionality () (return (test: function (tstValue) (assertEquals (tstValue, this.test.value);))) prototype_inconsistent_mixin: function () (var CLS1 = neue DefinedClass (); var cls2 = new DefinedClass (); Object.extend (CLS1, GetExtensionFunctionality ()); Object.extend (cls2, GetExtensionFunctionality ()); cls1.test.value = 3; try (cls2.test (3 );) catch (e) (if (e.jsUnitMessage) (info ( "prototype_inconsistent_mixin", "erwartet Ausnahme (" + + e.jsUnitMessage ")");))) Quelle: / website / root / scripts / Jaxson / Common.js Mixin: function (CopyTo, CopyFrom, forceCopy) ( var copiedFrom = eval (ops.singleSerialize (CopyFrom));for (Immobilien in CopyFrom) (if ((CopyTo [property] & & Kraft) | |! CopyTo [property]) (CopyTo [property] = copiedFrom [property];))) Bei der Durchführung der Mixin Methode ist der erste Schritt, um einen Puffer der Instanz zu erzeugen, die kopiert werden (ops.singleSerialize), und führen Sie dann den Puffer mit eval. Der Prozess der Generierung eines Puffers und der ihn ausführt, hat die Wirkung des Klonens das Objekt und seine Eigenschaften. Dann, wenn der Klon iteriert wird, um das Objekt verlängert werden Hinweise auf das geklonte Objekt, und nicht das ursprüngliche Objekt. Dies erfüllt die Forderung, dass das Objekt zu erweitern hat die Eigenschaften des Quell-Objekt kopiert. Im Source-Code des Artikels zu finden, finden Sie auch eine Methode namens ops.refMixin, die wie die anderen Mixin Implementierungen verhält und weist Verweise auf das Objekt zu erweitern. Bei der Umsetzung Mixins, halten Sie die folgenden Punkte beachten: • Mixins sind ein Mittel zur Erweiterung der Funktionalität eines Objekts, indem sie die Funktionalität eines anderen Objekts. In JavaScript können Sie diese Technik zu replizieren, indem Sie die Referenzen oder kopieren Sie die Funktionalität direkt. • Mixins sind eine Form von Prototyp-Programmierung, wo das Verhalten des Objekts wird zur Laufzeit ermittelt. • Sie können nicht schreiben Eigenschaften, die Teil der Funktionen, und so denken, dass der Verweis Kopieren kein Problem. Aber seien Sie gewarnt: Wenn Ihre Quelle Objektreferenzen Eigenschaften, die sich auf Objekte, dann das Objekt wird nicht kopiert, sondern die Referenz auf das Objekt. • Sie werden ausführlich Mixins Verwendung beim Schreiben von JavaScript-Code, so werden mit Ihrer Objekte und Referenzen vorsichtig sein. Ein Artikel eingereicht von Sonja Lande Disclaimer:Unsere Website ist nicht verantwortlich für den Inhalt dieses Artikels. Webarticles ist eine kostenlose Informationsquelle. Wichtig: Dieser Artikel "Implementing Mixins in JavaScript" wurde durch ein automatisches Software übersetzt. Wir fühlen uns leid für alle Rechtschreibfehler, die möglicherweise aufgetreten sind. Vielen Dank für Ihr Verständnis.
|
|||||
| Online: 506 users browsing the articles directory |
|
|