Считается, что for in медленный. Это действительно так, но я ща подумал, он сука, медленный не столько сам по себе, сколько из-за этого:
proto={a: 1, b: 2, c: 3, d: 4, e: 5}
ob=Object.create(proto)
ob.foo=10
ob.bar=20
ob.baz=30
monkeyFu=function(){
for(var i in this){
if(this.hasOwnProperty(i)){
console.log("Monkey do stuff with "+ this[i])
}
console.log("Monkey usage: "+this[i])
}
}
normalFu=function(){
for(var i in this){
if(!(this.hasOwnProperty(i))) break
console.log("Right usage: "+this[i])
}
}
monkeyFu.call(ob)
normalFu.call(ob)
// Monkey do stuff with 10
// Monkey usage: 10
// Monkey do stuff with 20
// Monkey usage: 20
// Monkey do stuff with 30
// Monkey usage: 30
// Monkey usage: 1
// Monkey usage: 2
// Monkey usage: 3
// Monkey usage: 4
// Monkey usage: 5
// Right usage: 10
// Right usage: 20
// Right usage: 30
А ведь именно так как monkeyFu его обычно и пользуют. А цепочка прототипов может ведь состоять и из тыщи объектов. Соответственно, если нужны только свойства самого объекта, без прототипов, использование по типу monkeyFu просто недопустимо. Это серьезный косяк.