2010-07-04 14 views
5

Quiero hacer una función que agregue un elemento a mi objeto localStorage. Ej .:¿Encadenando una función en JavaScript?

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

El primer método es getItem que recibe el artículo para objetos localStorage ... pero addItem sería una función personalizada. Esta cadena de funciones finalmente alertaría a Bill.

Entonces, ¿cómo puedo hacer que esta cadena funcione en localStorage?

+0

Eso no tiene ningún sentido. ¿Qué devolvería 'getItem'? – SLaks

+0

getItem debe estar al final de la cadena, pero aparte de eso se puede hacer – galambalazs

+0

¿No debería ser 'alerta (localStorage.getItem ('nombres'). AddItem ('Bill'))'. –

Respuesta

5

Esto es posible sicrear un/objeto decorador envoltorio que hace posible encadenar. Así es como funciona jQuery, por ejemplo. Pero es inútil en este caso.

Aunque hice una implementación posible.

Pero getItem romperá la cadena (por lo que siempre se debe usar al final).

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

Implementación

(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

Muchas gracias, debo estar jodiendo algo. Copio y pego tu código y luego agregué la alerta (storage.setItem ('names'). AddItem ('Bill'). GetItem ('names')); justo debajo y estoy obteniendo un storage.setItem no es una función? –

+0

@Oscar - Olvidaste los paréntesis: 'alerta (almacenamiento(). SetItem ('nombres'). AddItem ('Bill'). GetItem ('nombres'))' –

+0

@Oscar Marcel tiene razón, ahora crea instancias para cadenas de almacenamiento, por lo que debe escribir 'almacenamiento()'. Puedo modificarlo para que sea solo un objeto, pero puede volverse menos robusto. – galambalazs

5

Esto es imposible.

Si getItem('names') devuelve Bill, no puede llamar al addItem en él.
Sería posible agregar addItem y getItem métodos a cada elemento en el almacenamiento, pero sería una idea horrible idea.

+0

jQuery overload. –

+0

** es posible ** (sin aumentar localStorage). ver mi respuesta No es un caso muy útil, pero es una buena demostración del ** patrón de decorador **. – galambalazs

+1

@galambalazs: No es posible usar sus llamadas exactas. – SLaks

0

Lo más sencillo sería no hacerlo en absoluto :)

Si eso no funciona, entonces hay soluciones como la modificación del nativa getItem función, pero esa es una muy mala idea. La mejor manera sería escribir un contenedor alrededor de localStorage, muy parecido a lo que hace jQuery con los nodos DOM, y usar ese contenedor para obtener y colocar elementos en el almacenamiento local. La envoltura puede tener una interfaz como:

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

Entonces definir envolturas de tipo aceptables como Array dentro ApplicationStorage que tienen métodos como addItem

ApplicationStorage.Array 
    addItem() 

Cuando applicationStorage.getItem("names") se llama, devolver un objeto de ApplicationStorage.Array que contiene el método addItem que hará posible el encadenamiento.

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

Estoy confundido, ¿cómo se obtiene un artículo que no se ha agregado ???

getItem devuelve un objeto método contains addItem, y el método addItem devuelve un objeto contiene método getItem

De todos modos, echar un vistazo al siguiente tutorial. No resuelve completamente tu problema, pero te dará una idea.

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