JavaScript-объект просто делает не , имеет свойство length
, только Arrays
делает. Если вы хотите узнать количество свойств, определенных для объекта, вы должны выполнить итерации по ним и сосчитать их.
Кроме того, ваш цикл for in
подвержен ошибкам из-за расширения Object.prototype
, поскольку он будет проходить по всей цепочке прототипов и перечислять все свойства, которые находятся в цепочке .
Пример
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
Вы должны использовать метод hasOwnProperty для объекта, чтобы отфильтровать эти нежелательные свойства.
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
Многие JavaScript-фреймворки расширяют прототип, не используя hasOwnProperty
, что часто приводит к ужасным ошибкам.
Обновление
Относительно фактической проблемы, что ваш код не является анимацией обоих свойств.
for(var p in properties) {
...
for(var i = 0; i <= frames; i++)
{
setTimeout((function(exti, element) {
return function() {
// p gets overriden by for outer for in loop
element.style[p] = original + (pixels * exti) + 'px';
}
// you need to pass in a copy of the value of p here
// just like you do with i and element
})(i, element), i * (1000 / 60), element);
}
....
}