добавить метод в Object
Собственно, сабж. Видимо невнимательно читал книгу Ильи, не могу запустить код:
Object.prototype.length = function length(){ var a = []; for(var i in this){ a.push(i); } return a.length; } В консоли хрома: var a = {0:'a',1:'v'}; a.length() //1 Подскажите, пожалуйста, что не так? ------- при дебаге выяснилось, что это была ошибка где-то в коде, но всё равно значение показывается неправильное. каждому объекту добавляется еще один метод length (как и нужно), но он тоже пересчитывается. скажите, как-нибудь можно его не считать, как, например, toString(); |
3 выводит, всё правильно.
|
в моём коде я часто работаю с этим объектом, и нужно сделать так, что этот метод был спрятанный что-ли, не знаю как это называется. т.е., чтобы при вызове он работал как надо, но при переборе объекта его не считали. как-нибудь это можно реализовать?
|
как временный вариант просто объявил отдельной функцией.
function objectLength(object) { var a = []; for(var i in object){ a.push(i); } return a.length; } но вопрос всё равно интересен, можно скрыть созданный метод или нет, и как это правильно называется? |
Вот мы и подошли к тому, что не надо ничего пихать в Object.prototype.
|
Ну если сильно хочется:
Object.defineProperty(Object.prototype, "length", {value: function (...) {...}, enumerable: false}); (IE9+ и остальные браузеры) Но в новых браузерах есть Object.keys, поэтому лучше реализуйте его для старых браузеров и используйте Object.keys(obj).length. |
Фейл!
|
У тебя defineProperty для всех объектов enumerable:true
|
Часовой пояс GMT +3, время: 16:46. |