Главная страница
    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.47 MB
Время: 0.04 c
2-1200655402
_Shuler_
2008-01-18 14:23
2008.02.10
ХИНТ


15-1199714934
Parus
2008-01-07 17:08
2008.02.10
PHP: register_shutdown_function для рекламы


15-1200151340
Dmitry S
2008-01-12 18:22
2008.02.10
полупрозрачное чтото :)


15-1199285673
Riply
2008-01-02 17:54
2008.02.10
Новогодний винчестер.


4-1183336358
DagOT-R
2007-07-02 04:32
2008.02.10
Трей-иконки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский