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
В конце концов, я думаю, вам, вероятно, следует отказаться от идеи делать свои объекты счетными и найти другой способ делать то, что вы делаете.