我们都知道,for...of的出现是为了让开发者遍历各种数据结构能有一个统一的书写格式。但是官方并没有为对象(Object)提供一个for...of遍历的接口。那么,今天我们就来搞一波事情,通过修改Object原型上面的方法来实现对象的遍历。在这里我们就要用到ES6中的一个神器:Symbol!不说多的,咱们直接上干货!
var obj1 = {
name: '红酒',
price: '10元',
weight: '1KG',
author: '小酒一桌'
};
Object.prototype[Symbol.iterator] = function () {
var arr = [];
var index = 0;
for (var key in this) {
arr.push(key);
};
return {
next: function () {
if (index < arr.length) {
return {
value: this[arr[index++]],
done: false
}
} else {
return {
value: this[arr[index++]],
done: true
}
}
}.bind(this)
}
}
for (var key of obj1) {
console.log(key);
}如果注释掉原型链上面的方法,代码运行就会报一个类型错误:Uncaught TypeError: obj1 is not iterable;因为iterable是属于Symbol类型上面属性,所以我们得知,Symbol.iterator是为for...of遍历提供了一个统一的接口,所以要实现该功能,必然会要用到Symbol。代码实现思路有很多种,上面方案并不是最佳方案。只是为了证明一下,我们确实可以通过修改底层的思路来实现需求。

发表评论