Prototype Hash对象 学习

复制代码 代码如下:

  //Hash对象的工具函数

  function $H(object) {

  return new Hash(object);

  };

  var Hash = Class.create(Enumerable, (function() {

  //初始化,创建一个新的Hash对象

  function initialize(object) {

  this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);

  }

  //覆盖Enumerable里面的方法,遍历Hash对象时会用到

  function _each(iterator) {

  for (var key in this._object) {

  var value = this._object[key], pair = [key, value];

  pair.key = key;

  pair.value = value;

  iterator(pair);

  }

  }

  function set(key, value) {

  return this._object[key] = value;

  }

  function get(key) {

  if (this._object[key] !== Object.prototype[key])

  return this._object[key];

  }

  function unset(key) {

  var value = this._object[key];

  delete this._object[key];

  return value;

  }

  function toObject() {

  return Object.clone(this._object);

  }

  function keys() {

  return this.pluck('key');

  }

  function values() {

  return this.pluck('value');

  }

  //返回value的key

  function index(value) {

  var match = this.detect(function(pair) {

  return pair.value === value;

  });

  return match && match.key;

  }

  function merge(object) {

  return this.clone().update(object);

  }

  //更新原有Hash对象,把object参数内的键值对更新到原Hash对象

  function update(object) {

  return new Hash(object).inject(this, function(result, pair) {

  result.set(pair.key, pair.value);

  return result;

  });

  }

  function toQueryPair(key, value) {

  if (Object.isUndefined(value)) return key;

  return key + '=' + encodeURIComponent(String.interpret(value));

  }

  function toQueryString() {

  return this.inject([], function(results, pair) {

  var key = encodeURIComponent(pair.key), values = pair.value;

  if (values && typeof values == 'object') {

  if (Object.isArray(values))

  return results.concat(values.map(toQueryPair.curry(key)));

  } else results.push(toQueryPair(key, values));

  return results;

  }).join('&');

  }

  function inspect() {

  return '#<Hash:{' + this.map(function(pair) {

  return pair.map(Object.inspect).join(': ');

  }).join(', ') + '}>';

  }

  function toJSON() {

  return Object.toJSON(this.toObject());

  }

  function clone() {

  return new Hash(this);

  }

  return {

  initialize: initialize,

  _each: _each,

  set: set,

  get: get,

  unset: unset,

  toObject: toObject,

  toTemplateReplacements: toObject,

  keys: keys,

  values: values,

  index: index,

  merge: merge,

  update: update,

  toQueryString: toQueryString,

  inspect: inspect,

  toJSON: toJSON,

  clone: clone

  };

  })());

  Hash.from = $H;

  clone

  each

  get

  inspect

  keys

  merge

  remove

  set

  toJSON

  toObject

  toQueryString

  unset

  update

  value

  给出一些方法的示例,简单的方法就略过了

  toQueryString():

  

复制代码 代码如下:

  $H({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' }).toQueryString()

  // -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'

  // an empty hash is an empty query string:

  $H().toQueryString()

  // -> ''

  update():

  

复制代码 代码如下:

  var h = $H({ name: 'Prototype', version: 1.5 });

  h.update({ version: 1.6, author: 'Sam' }).inspect();

  // -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}>

  h.inspect();

  // -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}>

  //注意这里会改变原来的Hash对象

  merge():

  

复制代码 代码如下:

  var h = $H({ name: 'Prototype', version: 1.5 });

  h.merge({ version: 1.6, author: 'Sam' }).inspect();

  // -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}>

  h.inspect();

  // -> #<Hash:{'name': 'Prototype', 'version': 1.5}>

  //注意这里不改变原有Hash对象