Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2012, 17:57
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

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

Последний раз редактировалось tadjik1, 06.04.2012 в 18:05.
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2012, 18:01
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

3 выводит, всё правильно.
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2012, 18:12
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

в моём коде я часто работаю с этим объектом, и нужно сделать так, что этот метод был спрятанный что-ли, не знаю как это называется. т.е., чтобы при вызове он работал как надо, но при переборе объекта его не считали. как-нибудь это можно реализовать?
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2012, 18:19
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

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

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


но вопрос всё равно интересен, можно скрыть созданный метод или нет, и как это правильно называется?
Ответить с цитированием
  #5 (permalink)  
Старый 06.04.2012, 18:44
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Вот мы и подошли к тому, что не надо ничего пихать в Object.prototype.
Ответить с цитированием
  #6 (permalink)  
Старый 06.04.2012, 23:41
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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

Последний раз редактировалось Octane, 06.04.2012 в 23:48.
Ответить с цитированием
  #7 (permalink)  
Старый 06.04.2012, 23:57
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Фейл!
Ответить с цитированием
  #8 (permalink)  
Старый 07.04.2012, 00:03
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

У тебя defineProperty для всех объектов enumerable:true
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Extend через Object thelostdoom Общие вопросы Javascript 10 23.07.2011 16:36
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Скрипт калькулятора (не могу добавить еще одно значение) Jee_Day Я не знаю javascript 2 22.05.2009 13:19
Как добавить метод ко всем элементам? zubr80 Events/DOM/Window 3 06.04.2009 05:46
Добавить свой метод к элементу alekciy Events/DOM/Window 6 16.02.2009 19:29