2015-06-24 3 views
0

Я устал от циклического прохождения объектного литерала, чтобы получить его длину по той или иной причине. Я хочу определить свойство length на Object.prototype, я могу установить начальную длину, но я не знаю, как ее обновить, когда объект изменен?Обновление свойств пользовательских объектов в JavaScript

var obj = {a:1, b:2, c:3}; 
Object.defineProperty(Object.prototype, 'length', {value: 0}); 

// obj.length === 0; 

obj.d = 4; 

// obj === {a:1, b:2, c:3, d:4}; 
// obj.length === 0; 

Любой объект Строка/Массив делает это автоматически, если вы знаете, как это происходит, то, пожалуйста, просветите меня, если нет, то может быть, вы знаете способ, чтобы обновить эту настраиваемое свойство?

+0

http://jsfiddle.net/arunpjohny/9qpjoLbr/1/? –

ответ

3

Если вы хотите увеличить количество ключей в объекте, используйте Object.keys(obj).length.

Если вы с ума и хотят его на прототипе ...

Object.prototype.getKeyLength = function() { 
    return Object.keys(this).length; 
}; 

Любой объект Строка/Массив делает это автоматически, если вы знаете, как это происходит, то, пожалуйста, просветите меня ...

Это объекты-хозяева/примитивы, и это происходит за крышками.

+0

Ok dude приветствует хэдз-ап по методу 'keys', но' getKeyLength' является функцией и поэтому необходимо вызвать для обновления свойства ... это означает, что мне придется «ovserve» объект для изменений и затем вызовите функцию – LostInCyberSpace

0

Вы можете попробовать это:

Object.defineProperty(Object.prototype, 'keylength', { 
    get: function getKeyLength() { 
    return Object.keys(this).length; 
    } 
}); 
+0

cheers dude, но вся идея состоит в том, чтобы взглянуть на консоль хром при отладке и увидеть 50 значений свойств без необходимости щелчка 50 '(...)' инициаторов – LostInCyberSpace

+0

Кажется, вам это нужно только для отладки, если вы хотите сделать это проще, вы можете отправить запрос создателю Chrome. – DMaster

+0

Можете ли вы подробно остановиться на этом, может быть, с небольшим количеством кода? – LostInCyberSpace

1

Ваш INIT предположение достаточно близко, от Object.defineProperty()

Вы можете использовать использование получить вместо значения, чтобы определить поглотитель, который вызывается, когда определенное имущество доступен.

демонстрационную

Object.defineProperty(Object.prototype, 'len', { 
 
    writeable: false, 
 
    get: function() { 
 
    return Object.keys(this).length; 
 
    } 
 
}); 
 

 
var a = { 
 
    't' : 'This', 
 
    's' : 'A tsets' 
 
}; 
 

 
console.log(a.len); 
 

 
a['2222'] = 3; 
 

 
console.log(a.len);