Attuazione mixins in JavaScriptProblema che si desidera implementare Ruby-mixin stile in JavaScript di estendere facilmente le funzionalità dell'oggetto. Theory in Ruby, mixins sono un modo di estendere la funzionalità di un oggetto, adottando la funzionalità di un altro oggetto. Quando si crea un'istanza di un tipo di JavaScript, i metodi e le proprietà associate al tipo dipendono dalla dichiarazione del tipo. Per estendere la funzionalità di un esempio, una proprietà viene assegnato con una funzione o un altro oggetto. Fonte: / website / ROOT / articles ajax / javascript / DefinedClass funzione mixins.html () () DefinedClass.prototype.defined1 = function () () DefinedClass.prototype.defined2 = function () ()
La funzione DefinedClass viene utilizzato per definire un tipo. Due metodi, defined1 e defined2, sono associati con il tipo di DefinedClass. Ogni metodo è associato alla proprietà prototype, così ogni volta che viene creata un'istanza DefinedClass, questi metodi condividono la stessa istanza funzione. Così, se si assegna una proprietà di defined1 o defined2, allora tutte le istanze di DefinedClass sarà in grado di condividere la stessa istanza di proprietà. Solution Per estendere un 'istanza di DefinedClass, è possibile assegnare singolarmente le proprietà dell'istanza. Individualmente la copia di un immobile è noioso, una soluzione più efficace è quello di copiare le proprietà di un oggetto a un altro oggetto. Molti quadri, come i Prototipi e Dojo Toolkit, offrono la possibilità di copiare le proprietà. Di seguito è riportato l'attuazione mixin per il prototipo. Fonte: / website / ROOT / prototipo / dist / Prototype.js Object.extend = function (destinazione, sorgente) (for (proprietà in source) (destinazione [property] = source [proprietà];) destinazione di ritorno; La funzione Object.extend ha due parametri: destinazione e di origine. Il parametro di destinazione rappresenta un oggetto che avrà le proprietà aggiunte. Il parametro source rappresenta un oggetto che avrà le sue proprietà copiato. Le proprietà vengono copiati usando un ciclo for, perché non è possibile scorrere le proprietà di un'istanza di un oggetto in qualsiasi altro modo. L'identificatore di proprietà, non il valore della proprietà, viene iterata. Per recuperare il valore della proprietà, è possibile utilizzare la seguente sintassi: source.property Il problema con questa notazione è che la proprietà è definita in modo esplicito, e usarlo nel contesto di esecuzione di una funzione mixin è complicato. La soluzione è quella di utilizzare la notazione JavaScript array e recuperare la proprietà come un array. Tornando alla soluzione Prototype, come ogni proprietà della sorgente viene iterato, il valore viene recuperato e assegnato alla destinazione. Let's applicare il metodo di estendere utilizzando la seguente dichiarazione di un'istanza di oggetto. Fonte: / website / ROOT / articles ajax / javascript / MyExtensions mixins.html = (test: function (tstValue) (assertEquals (tstValue, MyExtensions.test.value);)) La dichiarazione MyExtensions classe è un riferimento statico a una singola proprietà integrato che è un'istanza di tipo Object. Vogliamo copiare la proprietà a un'istanza di DefinedClass, come illustrato nella seguente test. Fonte: / website / ROOT / articles ajax / javascript / prototype_mixin mixins.html: function () (var cls = DefinedClass new (); if (MyExtensions.test.value) (testManager.failed ();) Object.extend (cls, MyExtensions ); cls.test.value = 3; cls.test (3); cls.test.value = 10; cls.test (10);), Il codice di prova va al di là della semplice chiamata di Object.extend, ma rivela che la maggior parte toolkit attuare mixins utilizzando i tipi di anatra basata su riferimenti. Non è sbagliato, ma perché le funzioni sono oggetti che verranno ripartiti tra i diversi tipi di classe. Per capire questo, guarda l'attuazione del MyExtensions.test. L'applicazione fa riferimento la proprietà test.value funzione e riferimenti incrociati con il parametro tstValue. Per l'attuazione della funzione prototype_mixin, un'istanza di DefinedClass viene creato e poi estesa con i metodi di MyExtensions. La proprietà cls.test.value viene assegnato un valore di 3, e il metodo di prova si chiama. L'attuazione del test verifica il valore di MyExtensions.test.value come 3. Se il metodo di prova di cls erano una copia del metodo MyExtension.test, allora il test fallirebbe perché MyExtensions.test.value non è stato assegnato, come dimostra il blocco, se prova. Ma il codice di prova non viene meno, il che indica che digitando cls.test e MyExtensions.test sono uno e lo stesso metodo. Referenza a base di anatra ha alcuni comportamenti strani, uno dei quali è illustrato nel codice seguente. Fonte: / website / ROOT / articles ajax / javascript / GetExtensionFunctionality funzione mixins.html () (return (test: function (tstValue) (assertEquals (tstValue, this.test.value);))) prototype_inconsistent_mixin: function () (var cls1 = DefinedClass new (); cls2 var = DefinedClass new (); 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", "ad eccezione attesi (" + + e.jsUnitMessage ")");))), Qui, la funzionalità estesa è definita nel contesto di una chiamata di metodo. Nel precedente esempio, il metodo di prova è stata condivisa da più classi. Nel test, cls1 e cls2 devono anche condividere lo stesso metodo di prova. L'esecuzione del codice di prova si tradurrà in una deroga prevista cls.test.value affermando che non ha il valore di 3. In poche parole, il problema è che ci sono due modi di chiamare Object.extend, e si ottengono due comportamenti completamente diversi a causa alla natura del valore e riferimento della tipizzazione base di anatra. Si tratta di qualcosa che avete bisogno di essere al corrente, perché si potrebbe ottenere qualche comportamento strano. Naturalmente, uno di segno contrario potrebbe essere che, se si pensa alla natura della proprietà prototype , lo stesso tipo di risultati comportamento. Sono d'accordo che è il caso, ma anche rendersi conto che gli esempi non ha utilizzato l'identificatore di prototipo. Uno sviluppatore JavaScript sa che cosa le ramificazioni del prototipo sono, e quindi saprà quando utilizzare e quando non utilizzare la parola chiave. Negli esempi di questo articolo, un comportamento prototipo è stato illustrato senza l'utilizzo di prototipi. Sappiamo di questa situazione e sono due metodi mixin: uno che copia i riferimenti (digitando anatra di riferimento) e uno che fa una copia completa (digitando anatra valore). Il valore totale a base di anatra-digitato attuazione mixin segue. Fonte: / website / root / scripts / jaxson / Common.js mixin: function (CopyTo, copyFrom, forceCopy) ( var copiedFrom = eval (ops.singleSerialize (copyFrom));for (proprietà in copyFrom) (if ((CopyTo [proprietà] & & vigore) | |! CopyTo [proprietà]) (CopyTo [property] = copiedFrom [proprietà];))) Per l'attuazione del metodo mixin, il primo passo è quello di generare un buffer di istanza da copiare (ops.singleSerialize), e quindi eseguire il buffer usando eval. Il processo di generare un buffer e quindi l'esecuzione ha l'effetto di clonazione l'oggetto e le sue proprietà. Poi, quando il clone viene iterato, l'oggetto deve essere esteso ha riferimenti all'oggetto clonato, e non l'oggetto originale. Questo soddisfa il requisito che l'oggetto sia esteso ha copiato le proprietà dell'oggetto di origine. In codice l'articolo sorgente, troverete anche un metodo chiamato ops.refMixin, che si comporta come le altre implementazioni mixin e assegna i riferimenti per l'oggetto deve essere ampliata. Quando mixins di attuazione, di tenere i seguenti punti in mente: Mixins • sono un modo di estendere la funzionalità di un oggetto, adottando la funzionalità di un altro oggetto. In JavaScript, è possibile replicare questa tecnica copiando i riferimenti o copiando la funzionalità direttamente. Mixins • sono una forma di prototipo a base di programmazione in cui il comportamento dell'oggetto è determinata in fase di runtime. • L'utente non può scrivere le proprietà che fanno parte delle funzioni, e quindi penso che la copia di riferimento non è un problema. Ma sappiate che: se il vostro oggetto di origine riferimenti proprietà che gli oggetti di riferimento, allora l'oggetto non è copiato, ma il riferimento all'oggetto. • Si utilizzerà mixins ampiamente durante la scrittura di codice JavaScript, quindi state attenti con i vostri oggetti e riferimenti. un articolo presentato da Sonja Lande Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni. Importante: Questo articolo "Attuazione mixins in JavaScript" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.
|
|||||
| Online: 329 users browsing the articles directory |
|
|