明月笑刀无情
function reDefineValueOf(key) { const private = {}; const baseValueOf = key.valueOf; function valueOf(n) { if (arguments.length > 0) { if (!(n in private)) { private[n] = {}; } return private[n]; } return baseValueOf.apply(this, arguments) } Object.defineProperty(key, 'valueOf', { value: valueOf, configurable: true, writable: true, enumerable: false })}function map() { //通过count来解决,不同map对象,用相同对象作key的情况 const count = map.count++; function getKey(key) { if (key.valueOf.length !== 0) { return key.valueOf(count) } reDefineValueOf(key) return key.valueOf(count); } this.get = function (key) { return getKey(key).value; } this.set = function (key, value) { getKey(key).value = value; }}map.count = 0;var c = { c: 1 }var a = new map();var b = new map();a.set(c, 'a')b.set(c, 'b')console.log(a.get(c));console.log(b.get(c));核心思想是,既然key是对象,那么就给key对象新增一个函数,这个函数返回的值就是我们当时设置的值。然而由于可能出现不同的map对象,用相同的对象作key值的情况,这里给每一个map对象加了一个count计数器,用来作为map对象的id,以此作为key对象查找的一个依据。