Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> for…in и пользовательские объекты, атрибут DontEnum 
:(
    Опции темы
Иль
Дата 20.4.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Можно свойству пользовательского объекта изменить атрибут DontEnum, чтоб оно не перечислялось в for…in.
Если нет, то кто чем пользуется?

Это сообщение отредактировал(а) Иль - 20.4.2005, 09:39


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 20.4.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



А что это такое? Впервые слышу.
MSDN вообще только 1 страницу на такое выдал = и-то связанную с JScript...
Опиши суть...
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 20.4.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



О, Aliance, я ж у тебя этому научился. Я про for…in. Помню помню smile
Цитата
Спасибо много, плюса хватит

но попозже, как всегда в запарках, но ничего не упущу.

Цитата
Атрибут DontEnum - Свойство (метод) не должно попадать в перечисление при итерации объекта оператором for…in.


Вот тут правильно: http://wdh.suncloud.ru/js07.htm
В верху страницы, смотреть про
Цитата
У таких свойств, созданным пользователем, все перечисленные выше атрибуты сброшены в false


А тут по моему smile
Вот создаем мы пользовательский объект var Ilya={}; smile
наделяем его там всякими свойствами, там методами, а потом вдруг взбрело нам в голову (а ведь точно взбредет) в for…in перебрать его свойства, но поскольку методы это тоже свойства и у тех и у других DontEnum имеет значение false, методы неприятным образом попадают в перечисление. Чтоб этого не было я пока использую замеченную у Sardar "typeof"
Код

for (var i in Ilya)
if(typeof(Ilya[i])!="function"){
/*тут вояем нетленку*/
}

Ведь свойства у нас всегда будут "object", а методы "function"

Это сообщение отредактировал(а) Иль - 20.4.2005, 13:36


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 20.4.2005, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



typeof - есть пока единственное правильное решение. DontEnum это фича ИЕ, мозилле и другим по барабану.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 20.4.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Мона еще переводить в строки значения свойств и тестить их. И не говорите, что изврат, все может пригодиться smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 20.4.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата
а потом вдруг взбрело нам в голову (а ведь точно взбредет) в for…in перебрать его свойства

А зачем это нам взбредет?
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 20.4.2005, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Затрудняюсь ответить. Но мне требуется.
А, вот, например, при реализации ассоциативного массива со своими спицифическими методами.



--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 21.4.2005, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



К сожалению не кривых ассоциативных массивов в JS нет(в JScript есть словарь smile ), другими словами любой обьект есть ассоциативный массив, но ни один из его ключей не должен совпадать с базовым интерфейсом обьекта. Например ключь toString запрещён. Но нет проблем если мы сделаем пару get/set методов, а все ключи будем писать с уникальным префиксом:

Простая реализация за 5 минут:
Код
function HashMap() {
  len=0;
  this.getLength=function() {
    return len;
  }
  this.set=function(key, value) {
     if(typeof(this["~"+key])=="undefined") len++;  
     this["~"+key]=value;
  }
  this.remove=function(key) {
     if(typeof(this["~"+key])!="undefined") {
       len--
       delete this["~"+key];
       return true;
     } else return false;
  }
}
HashMap.prototype.get=function(key) {
  return this["~"+key]||null;
}
HashMap.prototype.getKeys=function() {
  var ret=[];
  for(var i in this) {
    if(i.charAt(0)=="~") ret[ret.length]=i.substr(1);
  }
  return ret;
}
HashMap.prototype.getValues=function() {
  var ret=[];
  for(var i in this)
    if(i.charAt(0)=="~") ret[ret.length]=this[i];
  return ret;
}

var a=new HashMap();
a.set("test", "ura"); //добавили
a.set("test2", 24); //еще раз
alert(a.getLength()); //2
a.remove("bla"); //такого ключа нет
a.remove("test"); //удалили
alert(a.getLength()); //1
alert(a.get("test")+", "+a.get("test2")); //undefined(null), 24
a.set("vingrad", "http://forum.vingrad.ru");
alert(a.getKeys()); //test2, vingrad
alert(a.getValues()); //24, http://forum.vingrad.ru


Длинна (len) это приватное поле, не доступное извне. Оно лежит в контексте конструктора, потому методы что его используют тоже обьявленны в конструкторе. Технически на каждый обьект создаётся своя копия метода, что хавает чуть больше памяти. Практически нам на это по барабану smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 23.4.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Тема плавно перетекла под название - ассоциативный массив, for ... in и префиксы

А я использую подъобекты с именем=имя и с двумя параметрами: имя и значение. Для экономии имя тоже несет информацию о дате или к-либо параметрах и приходится по значению имя доставать. Хотя конечно можно все засунуть в префикс у значения и удалять каждый раз, но я не люблю лишний раз использовать текстовые операции / методы.


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 23.4.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
Для экономии имя тоже несет информацию о дате или к-либо параметрах и приходится по значению имя доставать

Скорее всего я не понял что ты сказал, т.к. идея промелькнувшая в голове есть чудовищный изврат(нести в имени обьекта некоторую инфу о его состоянии)...

Цитата
но я не люблю лишний раз использовать текстовые операции / методы.

Правильная политика для не скриптовых языков, скриптовые всегда активно используют сторки/списки/таблицы

Цитата
Тема плавно перетекла под название - ассоциативный массив, for ... in и префиксы

Я ответил в первом посте. Что то не ясно или появились другие проблемы? Выкладывай, решим.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Aliance
Дата 23.4.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата
А, вот, например, при реализации ассоциативного массива со своими спицифическими методами.

Нарыл кое что, может пригодится: http://www.quirksmode.org/js/associative.html
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 23.4.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Цитата(Sardar @ 23.4.2005, 16:52)
идея промелькнувшая в голове есть чудовищный изврат

smile
Цитата
Изврат нам строить и жить помогает

Может не то сказал, не будем развивать. Я доволен моим извратом и не вижу решения оптимальнее. smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 28.4.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Вопрос про изврат:
в параметр функци передаются объект, который может быть и подобъектом (соответственно window[...] не пойдет, тк заранее не известно глобальный будет объект или нет)

Как из функции обратится к узлу с id=имя объекта smile

М
 

Илья, тут итак много уже постов, создавай отвельный топик...

Aliance

М
 
Иль выкладывай всегда код, а то вообще не понял что ты имел в виду...  подобьекты... =)

Сардар


Это сообщение отредактировал(а) Sardar - 28.4.2005, 23:17


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 4.5.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Кстати, есть метод, проверяющий, унаследовано ли свойство объекта - object.hasOwnProperty():
Код

var obj = new Object();
obj.prop = 3;

obj.hasOwnProperty("prop");
// вернет true, т.к. prop - это локальное свойсто obj

obj.hasOwnProperty("qwer");
// вернет false, т.к. obj не имеет свойства qwer
obj.hasOwnProperty("toString");
// вернет false, т.к. свойство toString унаследовано

PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 4.5.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



не пойдет. Конечно можно вообще не навязывать пользовательскому объекту своих методов, но на практике надо создавать как минимум метод реализующий свойству .length (у прототипа x=new objeckt его нет), а он покажет true и вылезет в for ... in.


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.