I delegati di attuazioneProblema
Che si desidera utilizzare un'architettura delegato per snellire come il vostro esegue il codice ed evitare scontri codice. Theory Durante la scrittura di JavaScript, molto spesso il codice si lotta per l'attenzione. Un esempio di codice in lotta per l'attenzione è l'evento window.onload. L'evento window.onload viene chiamato una volta che la pagina HTML è stato caricato completamente e inizializzata. Quando il browser chiede window.onload, il browser sta dando uno script la possibilità di inizializzare stesso con una pagina HTML completa. Per scripter, questo metodo è molto interessante, e se ci sono due toolkit usando window.onload, più probabile, non uno sovrascrive l'altro. Immaginate il seguente codice scritto da un toolkit: window.onload = function () (/ / inizializza il toolkit 1) In questo esempio di codice del toolkit sta dicendo che quando l'evento onload è chiamata, usare la mia funzionalità. Il toolkit secondo interessati all'evento onload assegnerebbe window.onload di seguito: window.onload = function () (/ / inizializza Toolkit 2) L'assegnazione secondo avrebbe funzionato, ma si pone la questione, cosa succede al di inizializzazione del toolkit 1? La risposta è che non è chiamato. Toolkit 1 e 2 sono in lotta per l'attenzione del evento onload, e il vincitore è se toolkit assegna l'evento onload scorso. Ci sono tre possibili soluzioni a questo dilemma: • Convertire il toolkit per utilizzare browser tag specifici che permetteranno loro di fare riferimento a funzioni multiple onload. L'aspetto negativo di questa soluzione è che avete bisogno di scrivere codice specifico browser, il che aumenta il costo di manutenzione del codice. • Utilizzare una funzione che chiama entrambi i inizializzazioni. Lo svantaggio è che è necessario fornire una funzione che gestisce sia inizializzazioni. • Convertire il toolkit per giocare bene con loro e non sovrascrivere l'inizializzazione altri. Il rovescio della medaglia è che il toolkit devono capire come chiamare le routine di inizializzazione altri. Solution Come accennato, l'aspetto negativo della prima soluzione presentata nella sezione precedente è che è specifico browser. Per Mozilla, la soluzione è piuttosto elegante, perché implementa una architettura delegato. Per altri browser, la prima soluzione non è così elegante, e quindi la soluzione finale è una miscela di soluzioni di seconda e terza. Per il momento, però, let's focus sulla seconda soluzione, che viene realizzato come segue: window.onload = function () (initializeToolkit1 (); initializeToolkit2 ();) La funzione windows.onload viene assegnata una funzione che chiama la routine di inizializzazione del toolkit 1 e 2. La soluzione funziona, ma ha problemi di manutenzione, dal momento che uno sviluppatore ha per aggiungere o rimuovere le routine di inizializzazione. Questo non è un problema importante, però. Se si guarda l'attuazione della funzione, è la conversione di una chiamata di funzione in due chiamate di funzione. Questa è la base di un delegato. Le funzioni di initializeToolkit1 e initializeToolkit2 non hanno nulla a che fare con l'altro, e quando sono chiamati, ognuno poteva essere facilmente ingannare pensando che essa è l'unica funzione assegnata per l'evento onload. Un delegato non è come un proxy, nel senso che un delegato tutte le chiamate funzioni, mentre un proxy chiamare una funzione prima e poi aspettarsi che la funzione di chiamata per chiamare le altre funzioni. Da una prospettiva di attuazione, un delegato dispone di una implementazione molto simile a un proxy. L'attuazione JavaScript di un delegato si differenzia da un delegato tradizionale, perché non vi è alcun esempio unico oggetto la gestione di tutti i riferimenti. In una classica applicazione delegare, chiamare la funzione window.onload chiamerà una struttura oggetto delegato, che invita i riferimenti gestiti funzione. Nel caso dell'esempio, che significa mettere la struttura oggetto delegato invita initializeToolkit1 e initializeToolkit2. Nell'attuazione delegato JavaScript, window.onload fa riferimento a una funzione di delegato genitore che contiene due riferimenti alle funzioni: func1 e func2. La funzione di delegato padre chiama sia func1 e func2. Quando le funzioni delegate madri sono incatenati insieme, func1 (scelti a scopo illustrativo) fa riferimento a una funzione di chiamata (initializeToolkit1), e func2 (scelto ancora una volta a scopo illustrativo) i riferimenti della delegazione prossimo capogruppo della catena. Nella delegazione del prossimo genitore, uno riferimenti funzione la funzione di chiamata (initializeFunction2), e gli altri riferimenti funzione un'altra funzione delegato genitore. Per capire il problema di serializzazione, cercando di immaginare serializzare window.onload riferimenti utilizzando: window.onload = function () (delegates.invoke (this, arguments);) var buffer = ops.serialize (window.onload); In questo esempio, i riferimenti window.onload una funzione che chiama il metodo globale delegates.invoke variabile, che chiamerà il initializeToolkit1 funzioni e initializeToolkit2. Se vogliamo salvare lo stato della pagina HTML, ci serializzare window.onload perché è un punto di riferimento standard. Eppure window.onload serializzazione non serializzare delegati. E 'serializzare il riferimento ai delegati e, quindi, quando la pagina viene ricreata, l'istanza delegati saranno mancanti. Potete leggere il paragrafo precedente e credo di aver perso il mio marmi, perché non è così che la serializzazione è fatto. Si potrebbe attuare la seguente soluzione, invece: window.unload = function () (var buffer = ops.serialize (delegati);) ` In questa soluzione, la funzione di scarico sarà chiamato, e un flusso di dati che rappresenta i delegati verranno generati. Ma è in realtà questa soluzione è corretta? Io sostengo che la soluzione sia delegando il problema dei delegati variabile in un'altra posizione, e non è nulla risolvere. Immaginate, per esempio, che si serializzare lo stato di una pagina. Come si iterare gli elementi, si sta generando le relative funzioni. Così si serializzare window.load e window.unload. Il grande vantaggio di questo approccio è che quando si codifica utilizzando un prototipo basato su JavaScript è un linguaggio che non si è preoccupato per le implementazioni multiple condividere gli stessi riferimenti. Utilizzando un approccio basato sul valore, è possibile copiare una funzione da un oggetto all'altro, e non preoccuparsi del problema mixin di cui all'articolo 2-15. Ora che si ha familiarità con la teoria che sta dietro attuazione delegato, guardiamo la scheda tecnica . Fonte: / website / root / scripts / jaxson / Common.js delegato: funzioni (ad esempio, funcIdentifier, newFunc) (var delegatePrototype = function () (var func1 = __replace1; var func2 = __replace2; func1.apply (this, arguments); func2 . applica (this, arguments);) origFunc var; if (! esempio [funcIdentifier]) (origFunc = function () ();) else (origFunc = esempio [funcIdentifier];) esempio [funcIdentifier] = Generics.expand (delegatePrototype , (__replace1: origFunc, __replace2: newFunc));), Fonte: / website / ROOT / articles ajax / javascript / exceptions.html window.onload = function () (window.onerror = function (msg, file, location) (info ( "window.onerror1", "il messaggio (" + msg + " ) file ( "+ file +") la posizione ( "+ location + ")");)) ops.delegate (window," onload ", function () (window.onerror = function (msg, file, location) (info ( "window.onerror2", "il messaggio (" + msg + ") file (" + file + ") la posizione (" + location + ")");))); In questo esempio, la funzione window.onload è assegnata una funzione. La riga successiva di codice sorgente utilizza la chiamata di metodo ops.delegate per convertire la funzione assegnata in un delegato. Così, quando l'evento window.onload è chiamata, le due funzioni sono chiamati, sia di che assegnano window.onerror. Una conseguenza di utilizzando i delegati è che un programmatore potrebbe utilizzare delegati, ma dimentica le risorse che assegna utilizzando i delegati sono condivisi. Pertanto, un buon programmatore non assegnerà window.onerror, ma utilizzerà un delegato per assegnare window.onerror. Durante la scrittura di codice in cui un metodo o una funzione di callback deve essere condivisa, è possibile utilizzare i delegati, ma mantenere i seguenti punti in mente : Delegati • consentire ai programmatori di condividere un metodo di callback, ma non deve presumere che le risorse nella loro implementazione del metodo sono esclusivi. • i delegati a risolvere il problema in cui una singola chiamata metodo può essere utilizzato per effettuare chiamate di metodo più. • i delegati non possono ritornare i valori, perché più metodi possono restituire i valori, quindi, i delegati dovrebbero sempre utilizzare i blocchi di codice. I blocchi di codice sono intrinsecamente singole, multiple, o non orientato verso i risultati. Utilizzando i blocchi di codice non richiede l'infrastruttura di fare qualcosa di speciale quando i dati devono essere restituiti. • i delegati possono essere implementate utilizzando riferimento o digitando anatra valore, con la differenza principale tra loro è la possibilità di serializzare. 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 "I delegati di attuazione" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.
|
|||||
| Online: 427 users browsing the articles directory |
|
|