Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   добавить метод в Object (https://javascript.ru/forum/misc/27247-dobavit-metod-v-object.html)

tadjik1 06.04.2012 17:57

добавить метод в 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();

Kolyaj 06.04.2012 18:01

3 выводит, всё правильно.

tadjik1 06.04.2012 18:12

в моём коде я часто работаю с этим объектом, и нужно сделать так, что этот метод был спрятанный что-ли, не знаю как это называется. т.е., чтобы при вызове он работал как надо, но при переборе объекта его не считали. как-нибудь это можно реализовать?

tadjik1 06.04.2012 18:19

как временный вариант просто объявил отдельной функцией.

function objectLength(object) { 
		var a = []; 
			for(var i in object){ 
				a.push(i); 
			} 
		return a.length; 
}


но вопрос всё равно интересен, можно скрыть созданный метод или нет, и как это правильно называется?

Kolyaj 06.04.2012 18:44

Вот мы и подошли к тому, что не надо ничего пихать в Object.prototype.

Octane 06.04.2012 23:41

Ну если сильно хочется:
Object.defineProperty(Object.prototype, "length", {value: function (...) {...}, enumerable: false});

(IE9+ и остальные браузеры)
Но в новых браузерах есть Object.keys, поэтому лучше реализуйте его для старых браузеров и используйте Object.keys(obj).length.

Octane 06.04.2012 23:57

Фейл!

Octane 07.04.2012 00:03

У тебя defineProperty для всех объектов enumerable:true


Часовой пояс GMT +3, время: 09:19.