Chaînage une fonction JavaScript?
-
02-10-2019 - |
Question
Je veux faire une fonction qui ajoute un élément à mon objet localStorage. Par exemple:.
alert(localStorage.getItem('names').addItem('Bill').getItem('names'));
La première méthode est getItem qui obtient l'élément pour les objets localStorage ... mais addItem serait une fonction personnalisée. Cette chaîne de fonctions serait finalement le projet de loi d'alerte.
Alors, comment cette chaîne de fonctions que j'apporter à localStorage?
La solution
Ceci est possible si vous créer un objet wrapper / décorateur qui rend possible l'enchaînement. Voilà comment fonctionne jQuery par exemple. Mais il est inutile dans ce cas .
J'ai fait une mise en œuvre possible, cependant.
getItem va briser la chaîne (il doit toujours être utilisé à la fin).
storage().setItem('names', 'Bill').getItem('names'); // or
storage().setItem('names').addItem('Bill').getItem('names'); // or
storage().key('names').value('Bill').set().get('names');
Mise en œuvre
(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 );
Autres conseils
Ceci est impossible.
Si retourne getItem('names')
Bill
, vous ne pouvez pas appeler addItem
là-dessus.
Il serait possible d'ajouter des méthodes de addItem
et getItem
à chaque élément dans le stockage, mais ce serait une horribles idée.
serait de ne pas faire la chose la plus simple du tout:)
Si cela ne fonctionne pas, il existe des solutions telles que la modification de la fonction native de getItem
mais c'est une très mauvaise idée. La meilleure façon serait d'écrire un wrapper autour localStorage
, un peu comme ce que jQuery fait aux noeuds DOM, et utiliser cette enveloppe pour obtenir et articles mis dans le stockage local. L'enveloppe pourrait avoir une interface comme:
ApplicationStorage
getItem()
setItem()
key()
removeItem()
définir ensuite des emballages de type acceptable comme Array
au sein de ApplicationStorage
qui ont des méthodes telles que addItem
ApplicationStorage.Array
addItem()
Quand applicationStorage.getItem("names")
est appelé, retourne un objet de ApplicationStorage.Array
qui contient la méthode addItem
qui fera chaîner possible.
getItem('names').addItem('Bill').getItem('names')
Je suis confus, comment obtenez-vous un élément qui n'a pas été ajouté ???
getItem renvoie un objet contient de l'addItem, et la méthode addItem renvoie un objet contient de l'getItem
Quoi qu'il en soit, jetez un oeil le tutoriel suivant. Il ne résout pas complètement le problème, mais vous donnera une idée.
http://guanfenglin.spaces.live.com/blog /cns!4E0822BF6C959B7F!668.entry