我是Javascript的新手,想知道是否有可能以允许我指定用于进行相等比较的函数的方式创建一组用户定义的对象?
这是一个人为的例子,只是为了说明我正在寻找的功能:
myClass = function(val){
var self = this;
self.val = val
self.equals = //used defined equals function
}
a = new myClass(1.0)
b = new myClass(2.0)
c = new myClass(2.0)
s = new Set() //does not have to be actual "Set"
s.add(a)
s.add(b)
s.add(c)
s.size === 2 //returns true
s.has(a) //returns true
s.has(b) //returns true
s.has(c) //returns true
我发现了Set实现(如this one),但它似乎只是为值设计,而不是用户定义的对象。我怀疑还有其他实现使用===
,但这在我的情况下没有用,因为我不相信我可以覆盖===
。
我的问题与this question非常相似。我之后再次发布它:a)我不一定需要原生ES6解决方案,并且愿意使用第三方库。 和b)自那个问题发布以来已经有一段时间了。
答案 0 :(得分:2)
如果您接受使用/覆盖valueOf
,那么您可以这样继续:
// Implementation of special Set:
function mySet() {
var self = this;
self.size = 0;
// Use a private map that will be keyed by the valueOf() of each added item:
var map = new Map();
self.add = function (item) {
map.set(item.valueOf(), item);
self.size = map.size;
};
self.has = function (item) {
return map.has(item.valueOf());
};
self[Symbol.iterator] = function* () {
for (var pair of map) {
yield pair[1]; // return the item ( not the valueOf() in [0])
}
};
// etc...
}
// Test code:
myClass = function(val){
var self = this;
self.val = val;
self.valueOf = function () { return self.val; };
}
a = new myClass(1.0);
b = new myClass(2.0);
c = new myClass(2.0);
s = new mySet(); //does not have to be actual "Set"
s.add(a);
s.add(b);
s.add(c);
document.write('size: ' + s.size + '<br>');
document.write('has(a): ' + s.has(a) + '<br>');
document.write('has(b): ' + s.has(b) + '<br>');
document.write('has(c): ' + s.has(c) + '<br>');
for (item of s) {
document.write('stored item: ' + JSON.stringify(item) + '<br>');
};
&#13;
几个月后,I answered a similar question,我没有建议使用 valueOf ,而是一个可以提供给 MySet 构造函数的函数,默认为JSON.stringify
。