如何创建一个具有私有属性的类,以便在将任意 2 个实例与私有属性中的不同项进行比较时,lodash
isEqual
返回 false?
例如,在以下代码中
isEqual
比较具有不同项目的 Bobcat 类的 2 个实例会产生 true
。我想要false
。是否缺少任何 Map 方法或其他什么?
const _ = require('lodash')
class Bobcat {
#items;
constructor() {
this.#items = new Map()
}
set(key, value) {
return this.#items.set(key, value)
}
get(key) {
return this.#items.get(key)
}
has(key) {
return this.#items.has(key)
}
delete(key) {
return this.#items.delete(key)
}
clear() {
this.#items.clear()
}
keys() {
return this.#items.keys()
}
values() {
return this.#items.values()
}
entries() {
return this.#items.entries()
}
forEach(callbackFn, thisArg) {
return this.#items.forEach(callbackFn, thisArg)
}
[Symbol.iterator]() {
return this.#items[Symbol.iterator]()
}
}
const cat1 = new Bobcat()
cat1.set('a', 1)
const cat2 = new Bobcat()
cat2.set('a', 2)
console.log(_.isEqual(cat1, cat2))
// true
另一个要求是在课外进行比较。类本身不应添加比较方法。例如,我不想
class Bobcat {
isEqual(otherCat) {
...
}
}
或任何特定于 lodash 的功能,例如
class Bobcat {
[Symbol.for('lodash.isEqual')](otherCat) {
...
}
}
自定义
toStringTag
返回 Map
为我解决了这个问题,而无需更改 isEqual 比较的下游代码。
get [Symbol.toStringTag]() {
return 'Map'
}
完整代码
const _ = require('lodash')
class Bobcat {
#items
constructor() {
this.#items = new Map()
}
set(key, value) {
return this.#items.set(key, value)
}
get(key) {
return this.#items.get(key)
}
has(key) {
return this.#items.has(key)
}
delete(key) {
return this.#items.delete(key)
}
clear() {
this.#items.clear()
}
keys() {
return this.#items.keys()
}
values() {
return this.#items.values()
}
entries() {
return this.#items.entries()
}
forEach(callbackFn, thisArg) {
return this.#items.forEach(callbackFn, thisArg)
}
[Symbol.iterator]() {
return this.#items[Symbol.iterator]()
}
get size() {
return this.#items.size
}
get [Symbol.toStringTag]() {
return 'Map'
}
}
const cat1 = new Bobcat()
cat1.set('a', 1)
const cat2 = new Bobcat()
cat2.set('a', 1)
// true
console.log('equal1', _.isEqual(cat1, cat2))
cat2.set('a', 2)
// false
console.log('equal2', _.isEqual(cat1, cat2))