Цепочка функции в JavaScript? - PullRequest
5 голосов
/ 05 июля 2010

Я хочу создать функцию, которая добавит элемент в мой объект localStorage. E.g.:

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

Первый метод - это getItem, который получает элемент для объектов localStorage ... но addItem будет пользовательской функцией. Эта цепочка функций, наконец, предупредит Билла.

Итак, как мне сделать эту цепочку функций в localStorage?

Ответы [ 4 ]

5 голосов
/ 05 июля 2010

Это возможно , если вы создаете объект оболочки / декоратора , который делает возможным создание цепочки. Вот как работает jQuery, например. Но это бесполезно в этом случае .

Я сделал возможную реализацию, хотя.

Но getItem разорвет цепочку (поэтому ее всегда следует использовать в конце).

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

Осуществление

(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 );
5 голосов
/ 05 июля 2010

Это невозможно.

Если getItem('names') возвращает Bill, вы не можете набрать addItem для него.
Можно было бы добавить методы addItem и getItem к каждому элементу в хранилище, но это была бы ужасная идея.

0 голосов
/ 05 июля 2010
getItem('names').addItem('Bill').getItem('names')

Я запутался, как получить элемент, который не был добавлен ???

getItem возвращает объект, содержащий метод addItem, а метод addItem возвращает объект, содержащий метод getItem

В любом случае, посмотрите следующий урок.Это не полностью решит вашу проблему, но даст вам представление.

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

0 голосов
/ 05 июля 2010

Самое простое - вообще не делать этого:)

Если это не сработает, то есть такие решения, как изменение нативной функции getItem, но это действительно плохая идея. Лучшим способом было бы написать обертку вокруг localStorage, очень похожую на то, что делает jQuery с узлами DOM, и использовать эту обертку для получения и помещения элементов в локальное хранилище. Оболочка может иметь такой интерфейс:

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

Затем определите допустимые оболочки типа Array внутри ApplicationStorage, которые имеют методы типа addItem

ApplicationStorage.Array
    addItem()

Когда вызывается applicationStorage.getItem("names"), вернуть объект ApplicationStorage.Array, который содержит метод addItem, который сделает возможным создание цепочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...