在JavaScript中链接一个函数?

Osc*_*son 5 javascript html5 chaining local-storage

我想创建一个将项添加到localStorage对象的函数.例如:

alert(localStorage.getItem('names').addItem('Bill').getItem('names'));
Run Code Online (Sandbox Code Playgroud)

第一个方法是getItem,它获取localStorage对象的项目......但addItem将是一个自定义函数.这一系列功能最终将提醒比尔.

那么,我如何将此功能链转换为localStorage?

SLa*_*aks 5

这是不可能的.

如果getItem('names')返回Bill,则无法调用addItem它.
可以为存储中的每个项目添加addItemgetItem方法,但这将是一个可怕的想法.


gbl*_*zex 5

这是可能的,如果你创建一个包装/装饰物,使链接成为可能.这就是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');
Run Code Online (Sandbox Code Playgroud)

履行

(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 );
Run Code Online (Sandbox Code Playgroud)