AFAIK, нет способа сделать это надежно, если вы не переключитесь на массив. Что, честно говоря, не не кажется странным - мне кажется довольно простым, что массивы исчисляются, а объекты - нет.
Вероятно, самое близкое, что вы получите, это что-то вроде
// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
var i = 0;
for ( var p in this ) i++;
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3
Но это создает проблемы или, по крайней мере, вопросы. Подсчитываются все созданные пользователем свойства, включая саму функцию _length! И хотя в этом простом примере вы можете избежать этого, просто используя обычную функцию, это не значит, что вы можете помешать другим сценариям делать это. так что ты делаешь? Игнорировать свойства функции?
Object.prototype.length = function()
{
var i = 0;
for ( var p in this )
{
if ( 'function' == typeof this[p] ) continue;
i++;
}
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2
В конце, я думаю, вам, вероятно, следует отказаться от идеи сделать ваши объекты исчисляемыми и придумать другой способ сделать то, что вы делаете.