实现集合时遇到的this指向问题
最近在学习js的数据结构实现,今天遇到了一个问题,想了很久没想明白,还是太菜了Orz 这里先记录一下。
今天看到了集合的部分,实现集合之间的并集等操作
在进行测试的时候发现无法获取并集操作后的结果,于是开始进行调试查看
图2中的this按理来说应该指向x,而不是传进来的参数y
我将生成x和y的顺序调换了一下,结果发现this是指向了后创建的那个集合对象! 不管是this.values() 还是otherSet.values() 都指向了相同的一个集合对象。 emmm......想了很久没想明白这里的问题。
最后我是将整个集合的代码换成了类的写法,解决了这个问题,我感觉可能是我写法的问题。
最后附上之前有问题的代码:
function Set() {
//属性
this.items = {}
//方法
//has()方法
Set.prototype.has = (value) => {
return this.items.hasOwnProperty(value)
}
//添加
Set.prototype.add = (value) => {
if (this.has(value)){
return false
}
this.items[value] = value
return true
}
//删除元素
Set.prototype.remove = (value) => {
if (!this.has(value)) {
return false
}
delete this.items[value]
return true
}
//移除集合中所有项
Set.prototype.clear = () => {
this.items = {}
}
//size()
Set.prototype.size = () => {
return Object.keys(this.items).length
}
//获取所有的值
Set.prototype.values = () => {
return Object.keys(this.items)
}
//集合之间的操作
//并集
Set.prototype.union = function (otherSet) {
console.log(this.values())
console.log(otherSet.values())
let unionSet = new Set(this)
let values = this.values()
console.log(values)
for (let i = 0; i < values.length; i++) {
unionSet.add(values[i])
}
let values = otherSet.values()
for (let i =0; i < values.length; i++) {
unionSet.add(values[i])
}
return unionSet
}
}