добавить метод в 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, время: 15:37. |