2010-07-04 18 views
5

Voglio fare una funzione che aggiunge un oggetto al mio oggetto localStorage. Es .:Concatenare una funzione in JavaScript?

alert(localStorage.getItem('names').addItem('Bill').getItem('names')); 

Il primo metodo è getItem che ottiene l'articolo per gli oggetti localStorage ... ma addItem sarebbe una funzione personalizzata. Questa catena di funzioni avvertirebbe finalmente Bill.

Quindi, come potrei rendere questa catena di funzioni a localStorage?

+0

Ciò non ha alcun senso. Cosa restituirebbe 'getItem'? – SLaks

+0

getItem dovrebbe essere alla fine della catena, ma a parte questo può essere fatto – galambalazs

+0

Non dovrebbe essere solo 'alert (localStorage.getItem ('nomi'). AddItem ('Bill'))'. –

risposta

5

Questo è possibile se sicrea un involucro/oggetto decoratore che rende concatenamento possibile. Ecco come funziona jQuery, ad esempio. Ma è inutile in questo caso.

Ho fatto una possibile implementazione, però.

Ma getItem interromperà la catena (quindi dovrebbe essere sempre utilizzata alla fine).

storage().setItem('names', 'Bill').getItem('names'); // or 
storage().setItem('names').addItem('Bill').getItem('names'); // or 
storage().key('names').value('Bill').set().get('names'); 

Attuazione

(function(window, undefined) { 

var storage = function(key, value) { 
    return new storage.init(key, value); 
}; 

storage.init = function(key, value) { 
    this._key = key; 
    this._value = value; 
}; 

storage.init.prototype = { 

    key: function(key) { 
    this._key = key; 
    return this; 
    }, 

    value: function(value) { 
    this._value = value; 
    return this; 
    }, 

    get: function(key) { 
    key = isset(key) || this._key; 
    return localStorage.getItem(key); 
    }, 

    set: function(key, value) { 
    this._key = key = isset(key) || this._key; 
    this._value = value = isset(value) || this._value; 
    if (key && value) { 
     localStorage.setItem(key, value); 
    } 
    return this; 
    }, 

    addItem: function(value) { 
    this._value = isset(value) || this._value; 
    if (this._key && value !== undefined) { 
     localStorage.setItem(this._key, value); 
    } 
    return this; 
    }, 

    // aliases... 
    getItem: function(key) { 
    return this.get(key); 
    }, 
    setItem: function(key, value ) { 
    return this.set(key, value); 
    } 
}; 

function isset(value) { 
    return value !== undefined ? value : false; 
} 

window.storage = storage; 

})(window); 
+0

Grazie mille, devo fare un casino. Copia e incolla il tuo codice e poi ho aggiunto un avviso (storage.setItem ("nomi"). AddItem ('Bill'). GetItem ('nomi')); proprio sotto di esso e sto ottenendo un storage.setItem non è una funzione? –

+0

@Oscar - Hai dimenticato le parentesi: 'alert (storage(). SetItem ('nomi'). AddItem ('Bill'). GetItem ('names'))' –

+0

@Oscar Marcel ha ragione, ora crea istanze per catene di memoria, quindi è necessario scrivere 'storage()'. Posso modificarlo per essere solo un oggetto, ma potrebbe diventare meno robusto. – galambalazs

5

Questo è impossibile.

Se getItem('names') restituisce Bill, non è possibile chiamare addItem su di esso.
Sarebbe possibile aggiungere i metodi addItem e getItem a ogni elemento nell'archivio, ma sarebbe un'idea orribile.

+0

jQuery overload. –

+0

** è possibile ** (senza aumentare localStorage). guarda la mia risposta Non è un caso molto utile, ma una buona dimostrazione del ** modello decoratore **. – galambalazs

+1

@galambalazs: Non è possibile usare le sue chiamate esatte. – SLaks

0

La cosa più semplice sarebbe quella di non fare questo a tutti :)

Se questo non funziona, poi ci sono soluzioni come la modifica del nativo getItem funzione ma questa è una pessima idea. Il modo migliore sarebbe scrivere un wrapper attorno allo localStorage, molto simile a quello che jQuery fa ai nodi DOM, e usare quel wrapper per ottenere e mettere gli elementi nella memoria locale. L'involucro potrebbe avere un'interfaccia come:

ApplicationStorage 
    getItem() 
    setItem() 
    key() 
    removeItem() 

Quindi definire involucri di tipo accettabili come Array all'interno ApplicationStorage che hanno metodi come addItem

ApplicationStorage.Array 
    addItem() 

Quando applicationStorage.getItem("names") viene chiamato, restituire un oggetto di ApplicationStorage.Array che contiene il metodo addItem che renderà possibile il concatenamento.

0
getItem('names').addItem('Bill').getItem('names') 

Sono confuso, come si ottiene un articolo che non è stato aggiunto ???

getItem restituisce un oggetto contiene il metodo addItem, e il metodo addItem restituisce un oggetto contiene metodo getItem

In ogni caso, avere uno sguardo il seguente tutorial. Non risolve completamente il tuo problema, ma ti darà un'idea.

http://guanfenglin.spaces.live.com/blog/cns!4E0822BF6C959B7F!668.entry

Problemi correlati