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
Зрештою, я думаю, вам, мабуть, слід відмовитись від ідеї зробити свої об’єкти рахунковими та винайти інший спосіб робити все, що ви робите.