class Pair {
constructor(x, y) {
this.x = x
this.y = y
}
// TODO ?
}
const set = new Set()
set.add(new Pair(1, 2))
如何使后续声明返回true?
set.has(new Pair(1, 2)) // -> false
(我们可以在Java中覆盖equals
和hashCode
类的Pair
)
现在覆盖平等检查是不可行的:https://stackoverflow.com/a/29759699/7803502
相反,你可以扩展Set
类来创建自己的PairSet
。
class Pair {
constructor(x, y) {
this._x = x
this._y = y
}
toString() {
return [
this._x,
this._y,
].join(',')
}
}
class PairSet extends Set {
add(pair) {
return super.add(pair.toString())
}
has(pair) {
return super.has(pair.toString())
}
delete(pair) {
return super.delete(pair.toString())
}
}
(function test() {
const set = new PairSet()
set.add(new Pair(1, 2))
console.log(set.has(new Pair(1, 2))) // true
console.log(set.has(new Pair(2, 1))) // false
})()
如果引用指向内存中的相同值,则引用将是相等的 - new
将(默认情况下)创建一个新对象,该对象不能是===
到单独的一个。我想一个选项是返回一个现有的x,y
Pair实例,如果它是在之前构建的:
const pairs = {};
function getMakePair(x, y) {
const str = x + ',' + y;
if (pairs[str]) {
return pairs[str];
}
const pair = new Pair(x, y);
pairs[str] = pair;
return pair;
}
class Pair {
constructor(x, y) {
this.x = x
this.y = y
}
}
const set = new Set()
set.add(getMakePair(1, 2))
console.log(set.has(getMakePair(1, 2)))
或者,如果您希望所有操作都在构造函数中,您可以让构造函数显式创建/返回实例,尽管IMO有点不太清楚,并且有点奇怪:
class Pair {
constructor(x, y) {
const str = x + ',' + y;
if (Pair.pairs[str]) {
return Pair.pairs[str];
}
const instance = Object.create(Pair.prototype);
instance.x = x
instance.y = y
Pair.pairs[str] = instance;
return instance;
}
}
Pair.pairs = {};
const set = new Set()
set.add(new Pair(1, 2))
console.log(set.has(new Pair(1, 2)))
当然,如果你使用这样的方法来缓存实例,你不应该改变实例的.x
/ .y
属性,否则缓存机制将更难以推理。如果您想要这种可变的缓存功能,可以考虑在实例数组上使用.find
。