Главная страница
    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.042 c
2-1200561640
Nil
2008-01-17 12:20
2008.02.10
Прозрачность TBitmap


11-1183307342
Rusya
2007-07-01 20:29
2008.02.10
Тики в тракбаре


2-1200669758
savyhinst
2008-01-18 18:22
2008.02.10
TCompressionStream


2-1200391223
Lamer666
2008-01-15 13:00
2008.02.10
MDI и ActionMeneger+ActionMainMenuBar


1-1193526029
Вопрошающий
2007-10-28 02:00
2008.02.10
Помогите распаковать gzip





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