AFAIK, não há como fazer isso de forma confiável, a menos que você mude para um array. O que, honestamente, não parece estranho - parece bastante direto para mim que as matrizes são contáveis, e os objetos não.
Provavelmente, o mais perto que você chegará é algo assim
// 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
Mas isso cria problemas, ou pelo menos perguntas. Todas as propriedades criadas pelo usuário são contadas, incluindo a própria função _length! E embora neste exemplo simples você possa evitá-lo usando apenas uma função normal, isso não significa que você pode impedir que outros scripts façam isso. Então, o que você faz? Ignorar propriedades da função?
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
No final, acho que você provavelmente deveria abandonar a ideia de tornar seus objetos contáveis e descobrir outra maneira de fazer o que quer que esteja fazendo.