为何for..in循环中继承属性晚于对象自身属性输出?
为什么for..in循环中自有属性先于继承属性输出?
首先看代码示例:
let animal = { eats: true }; let rabbit = { __proto__: animal, // (*) jumps: true, // (**) }; console.log(Object.keys(rabbit)); // [jumps] for(let prop in rabbit) console.log(prop); // jumps, eats
核心原因分为两点:
__proto__并非普通自有属性
在对象字面量中声明__proto__: animal,并不是给rabbit添加一个名为__proto__的自有属性,而是用来设置该对象的原型指向animal。所以rabbit的自有属性只有jumps,这也是Object.keys(rabbit)仅返回["jumps"]的原因——它只会枚举对象的自有可枚举属性。for..in循环的遍历逻辑
for..in的遍历顺序遵循固定规则:- 先遍历对象自身的所有可枚举属性,按照属性被添加到对象的顺序输出;
- 再依次遍历原型链上每个原型对象的可枚举属性,每个原型内的属性同样遵循插入顺序。
这里rabbit的自有属性只有jumps,会被优先输出;之后遍历它的原型animal的可枚举属性eats,所以eats会在后面输出。
额外说明:哪怕把__proto__的声明放在jumps之后,结果也完全一致——因为__proto__的作用是设置原型,既不会成为自有属性,也不影响自有属性的遍历顺序。
内容的提问来源于stack exchange,提问作者Даниил Дорофеев
相关产品推荐
相关产品推荐

