Ссылки будут равны, только если они указывают на одно и то же значение в памяти - 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)))
Или, если вы хотите, чтобы все действия были в конструкторе, вы можете сделать так, чтобы конструктор явно создавал / возвращал экземпляр, хотя это немного менее понятно для ИМО, и этонемного странно видеть:
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
экземпляра, иначе кешированиеМеханизм будет сложнее рассуждать.Если вам нужна такая функция кэширования mutable , вы можете вместо этого использовать .find
в массиве экземпляров.