如何实现方法链

How to Implement Method Chaining

有没有办法从 Cache class

链接以下方法

cache = cache.getKey(key) || cache.setKey(key).get(key); // cache = cache.getKey(key) || cache.setKey(key).getKey(key);

我知道我们有本地方法 Map.prototype​.set()Map.prototype​.get() 但我想以这种方式实现它。如果您有任何建议,请告诉我。

function isObject(arg) {
  const typeOfObj = typeof arg;
  return (typeOfObj === 'object' || typeOfObj === 'function') && arg !== null;
}

class Cache {
  constructor() {
    this.map = new Map();
    this.weakmap = new WeakMap();
  }

  setKey(key) {
    const map = this[isObject(key) ? 'weakmap' : 'map'];
    return map.set(key, new Cache());
  }

  getKey(key) {
    const map = this[isObject(key) ? 'weakmap' : 'map'];
    return map.get(key);
  }
}

function getCache(args, cache) {
  for (const key of args) {
    cache = cache.getKey(key) || cache.setKey(key).get(key);
    // cache = cache.getKey(key) || cache.setKey(key).getKey(key);
  }
  return cache;
}

function memoize(fn) {
  const cache = new Cache();
  return (...args) => {
    const item = getCache(args, cache);

    if (Reflect.has(item, 'value')) {
      return item.value;
    }

    return (item.value = fn(args));
  };
}

let counter = 1;
function foo() {
  counter += 1;
  return counter;
}

const id1 = Symbol('id');
const id2 = Symbol('id');

const memoizedFoo = memoize(foo);
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id2)); // 3
console.log(memoizedFoo(id2)); // 3

非常感谢任何帮助。

不幸的是,如果您要 "GET" 钥匙,您 不能 return 地图,因为您要钥匙,所以它必须 return 钥匙。所以你不能链接那个方法。但是任何默认情况下不应该 return 的方法(IE 将无效),我们可以这样做:

cache = cache.getKey(key) || cache.setKey(key).get(key);

这将 return 一个布尔值,因为 ||符号表示 return 如果其中一个为真则为真。

但是,如果您想进行 JQuery 所做的那种链接,那很容易实现!你要做的是 return this 或每个方法中的对象。

像这样:

function isObject(arg) {
  const typeOfObj = typeof arg;
  return (typeOfObj === 'object' || typeOfObj === 'function') && arg !== null;
}

class Cache {
  constructor() {
    this.map = new Map();
    this.weakmap = new WeakMap();
  }

  setKey(key) {
    const map = this[isObject(key) ? 'weakmap' : 'map'];
    map.set(key, new Cache());
    return this; // HERE'S THE IMPORTANT PART
  }
}

let counter = 1;
function foo() {
  counter += 1;
  return counter;
}

const id1 = Symbol('id');
const id2 = Symbol('id');

const memoizedFoo = memoize(foo);
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id2)); // 3
console.log(memoizedFoo(id2)); // 3