Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

вопрос про prototype и js   Найти похожие ветки 

 
Dmitry S ©   (2008-01-12 19:47) [0]

Определяю общий метод для всех массивов:


Array.prototype.walk = function (void_function) {
   // код
}


Затем далее по скрипту создаю массив:

var arr = new Array();

Кладу туда чего нибудь:

arr.push("text");

А затем перечисляю:

for(i in arr) {
alert(i);
}


В результате получаю два алерта:
1. "0"
2. "walk"

Вопрос: Как грамотно избавится до включения "walk" в перечисление?


 
palva ©   (2008-01-12 20:11) [1]

Непонятно.
Кто от чего будет избавляться. И причем здесь прототип.


 
Ketmar_   (2008-01-12 20:18) [2]

> Dmitry S ©   (12.01.08 19:47) 
> Как грамотно избавится до включения "walk" в перечисление?
не включать walk в прототип.


 
homm ©   (2008-01-12 20:29) [3]

> [0] Dmitry S ©   (12.01.08 19:47)

Не понимаю. Ты кладешь в него "text", а в алерте получаешь "0" ?


 
palva ©   (2008-01-12 20:36) [4]

homm ©   (12.01.08 20:29) [3]
Он получает индекс. Если бы он применил for each (i in arr) он получил бы значения.


 
homm ©   (2008-01-12 21:05) [5]

Есть подозрение, что оператор in рассматривает arr как объект, к которому ты сам добавил поля. Нужно воспользоватся привычным циклом.


 
Dmitry S ©   (2008-01-12 22:48) [6]

я нашел хороший справочник по JS:
http://wdh.suncloud.ru/js07.htm#ref371
тут написано, что каждое свойство (а методы в JS - это те же свойства) может иметь атрибут DontEnum.
Есть даже метод который проверяет установлен ли этот атрибут: propertyIsEnumerable. Но нет способа задать этот атрибут.

Пока сделал так:
Array.prototype.walk = function (void_function) {
for(var i in this) {
 if (Array.prototype[i]==undefined) {
  void_function(this[i]);
 }
}
}


ИМХО это кривое решение


 
palva ©   (2008-01-12 23:45) [7]

А почему [5] не подошло? Типа
for(i = 0; i < arr.length(); i++) {


 
palva ©   (2008-01-12 23:48) [8]

Или тебе нужно, чтоб свойства массива тоже входили в перечисление?
Ты бы хоть тайные желания-то свои объяснил.


 
Dmitry S ©   (2008-01-13 07:28) [9]


> А почему [5] не подошло? Типа
> for(i = 0; i < arr.length(); i++) {

К примеру:

var i, s;
var arr = new Array();
arr.push("a");
arr.push("b");
arr.push("c");
arr.push("d");
arr.push("e");

delete arr[2];

s="";
for (i in arr) s += arr[i];
alert(s); // abde

s="";
for (i=0; i<arr.length; i++) s += arr[i];
alert(s);  // abundefinedde


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


 
Ketmar_   (2008-01-13 12:22) [10]

> Dmitry S ©   (13.01.08 07:28) [9]
а вот скажи, милчеловек: на кой его (метод) в прототип пихать? типа вызывать функцию с параметром — это сейчас немодно? помедитируй над [2] немного.


 
palva ©   (2008-01-13 12:27) [11]


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

Ну то есть, надо исключить только функции. Тогда я бы написал так:
for(i in arr) {
 if((typeof arr[i])!="function") {...


 
homm ©   (2008-01-13 12:38) [12]

> [10] Ketmar_   (13.01.08 12:22)
> а вот скажи, милчеловек: на кой его (метод) в прототип пихать?
> типа вызывать функцию с параметром — это сейчас немодно?

Нет, не модно, это не ООП.


 
Ketmar_   (2008-01-13 12:52) [13]

> homm ©   (13.01.08 12:38) [12]
дык что интересно — возня с прототипами в JS тоже не ООП. там вообще ООП нет, его всё равно дописывать руками приходится. %-)

так что как бы автор не мучался — а модно не выйдет.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.052 c
6-1180064868
Strang
2007-05-25 07:47
2008.02.10
Почтовый сервер


2-1199758661
Артем
2008-01-08 05:17
2008.02.10
TShockwaveFlash. Как записать в поток?


15-1199109936
ArtemESC
2007-12-31 17:05
2008.02.10
Чем можно прочистить водный камень в кране?


15-1199885519
AlexanderMS
2008-01-09 16:31
2008.02.10
Атака окон во время переадресации.


2-1200213662
Kotov
2008-01-13 11:41
2008.02.10
Своё приложение вместо bat-файла- Возможно?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский