实现集合时遇到的this指向问题

90 阅读1分钟

实现集合时遇到的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
	}
}