2010-07-04 21 views
5

Ich möchte eine Funktion, die ein Element zu meinem localStorage-Objekt hinzufügen. Z.B .:Verketten einer Funktion in JavaScript?

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

Die erste Methode ist getItem, die für Objekte local den Punkt bekommt ... aber addItem wäre eine benutzerdefinierte Funktion sein. Diese Funktionskette würde Bill endlich alarmieren.

Also, wie würde ich diese Funktionskette zu localStorage machen?

+0

Das ergibt keinen Sinn. Was würde 'getItem' zurückgeben? – SLaks

+0

getItem sollte am Ende der Kette sein, aber abgesehen davon kann es getan werden – galambalazs

+0

Sollte es nicht nur 'alert (localStorage.getItem (' Namen '). AddItem (' Bill ')) '. –

Antwort

5

Dies ist möglich,, wenn Sie einen Wrapper/Dekoratorobjekt erstellen , die möglich macht verketten. So funktioniert beispielsweise jQuery. Aber es ist nutzlos in diesem Fall.

Ich machte eine mögliche Implementierung, obwohl.

Aber getItem wird die Kette brechen (so sollte es immer am Ende verwendet werden).

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

Implementierung

(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

Vielen Dank, ich muss etwas vermasseln tho. Ich kopiere deinen Code und füge ihn ein und fügte dann alert hinzu (storage.setItem ('names'). AddItem ('Bill'). GetItem ('names')); direkt darunter und ich bekomme ein storage.setItem ist keine Funktion? –

+0

@Oscar - Sie haben die Klammern vergessen: 'alert (storage(). SetItem ('names'). AddItem ('Bill'). GetItem ('names'))' –

+0

@Oscar Marcel hat recht, es erstellt nun Instanzen für Speicherketten, also müssen Sie 'storage()' schreiben. Ich kann es ändern, um nur ein Objekt zu sein, aber es kann weniger robust werden. – galambalazs

5

Dies ist unmöglich.

Wenn getItem('names')Bill zurückgibt, können Sie nicht addItem darauf aufrufen.
Es wäre möglich, addItem und getItem Methoden zu jedem Element im Speicher hinzuzufügen, aber es wäre eine schreckliche Idee.

+0

jQuery Überladung. –

+0

** es ist möglich ** (ohne localStorage zu erweitern). Sieh meine Antwort. Kein sehr nützlicher Fall, aber eine gute Demonstration des Dekorationsmusters **. – galambalazs

+1

@galambalazs: Es ist nicht möglich, seine genauen Anrufe zu verwenden. – SLaks

0

Die einfachste Sache dies nicht sein würde tun :)

Wenn das nicht funktioniert, dann gibt es Lösungen, wie die native getItem Modifizieren Funktion, aber das ist eine wirklich schlechte Idee. Der beste Weg wäre, einen Wrapper um localStorage zu schreiben, ähnlich wie jQuery für DOM-Knoten, und diesen Wrapper zum Abrufen und Ablegen von Elementen im lokalen Speicher verwendet.

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

Dann definieren akzeptablen Typ Umhüllungen wie Array innerhalb ApplicationStorage das haben Methoden wie addItem

ApplicationStorage.Array 
    addItem() 

Wenn applicationStorage.getItem("names") genannt wird, kehren ein Objekt von ApplicationStorage.Array, die das Verfahren enthält: die Umhüllung eine Schnittstelle wie hätte addItem, die die Verkettung ermöglichen.

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

Ich bin verwirrt, wie erhalten Sie ein Element, das nicht hinzugefügt wurde ???

getItem ein Objekt zurückgibt enthält addItem Methode und addItem Methode liefert ein Objekt enthält getItem Methode

Wie auch immer, haben eine der folgenden Tutorial aussehen. Es löst Ihr Problem nicht vollständig, aber wird Ihnen eine Idee geben.

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

Verwandte Themen