Объединение в цепочку функции в JavaScript?

Я хочу сделать функцию, которые добавляют объект к моему объекту localStorage. Например:

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

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

Так, как я сделал бы эту функциональную цепочку к localStorage?

5
задан gblazex 6 July 2010 в 00:15
поделиться

4 ответа

Это возможно , если вы создаете объект-оболочку / декоратор , который делает возможным создание цепочки. Так, например, работает 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
ответ дан 13 December 2019 в 22:01
поделиться

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

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

5
ответ дан 13 December 2019 в 22:01
поделиться

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

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

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

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

ApplicationStorage.Array
    addItem()

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

0
ответ дан 13 December 2019 в 22:01
поделиться
getItem('names').addItem('Bill').getItem('names')

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

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

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

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

0
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: